KENスクールブログ-パソコンスクール パソコン教室 KENスクール

Java

[Java]try-with-resources文

Java SE6まではファイル入出力やデータベースへのアクセスをするとき、そのためのリソース(プログラムでの使用が終わったら閉じられなければいけないオブジェクト)を解放するために、例外処理のfinally句などでclose処理を記述していました。ですが、アクセスがある度にclose処理を書くのが面倒、書き忘れるとメモリリークの原因になる等少々手間のかかるものでした。

そこで、Java SE7から追加されたtry-with-resources文を使うとこれらの問題が解決できるというわけで、今回はその機能紹介とサンプルコードをご紹介したいと思います。

try-with-resources文

はじめに、try-with-resources文を使用するにはjava.lang.AutoCloseableかjava.io.Closeableインターフェースを実装するクラスである必要があります。このインターフェースにはclose()メソッドのみ定義されており、ファイル入出力のjava.ioやデータベースアクセスのjava.sqlパッケージなどのリソース関連クラスは、これらのインターフェースを実装しているため、暗黙的に解放することができます。

使用方法としては、まず例外処理try(){}ブロックの()内にリソースを書き込みます。すると、この()内に書かれたリソースプログラムはコードブロックの終わりで各リソースが確実に閉じられるという仕様になっているのです。

では実際にSE6までのサンプルとSE7のサンプルを見比べてみましょう。

SE6までのサンプル
※サンプルはjava.ioパッケージを使ったファイル入出力例文

SE6以前ではfinallyブロック内にストリームのクローズ処理を書いていたが、SE7ではそれをtry-with-resources文で行う事が可能です。

SE7以降のサンプル

これでclose処理から解放されますね!是非使ってみて下さい!!

この記事に関連する講座

プログラミング言語のスタンダードを身につけよう!!

詳しくはこちら


カテゴリー: Java プログラム

Javaの基礎【コメント】

コメントとは、コンピュータがプログラム実行時に無視する文字列のことです。
プログラムの実行時には、無視されるため、実行時には意味を持ちません。

複数人でシステムを開発していた場合、作成したソースコードを別の人が読んだとき、
また、同じ人であっても時間をおいてから読んだりした場合には、その意図を読み取ることが困難なことがあります。
その為に、コードの意図をコメントとしてソースコードに挿入することが役立ちます。 

Javaのコメントは行コメント、ブロックコメント、ドキュメントコメントの3種類があります。

行コメント

行コメントは「//」を使用します。プログラム中に「//」が現れた場合「//」から行末までをコメントとして扱います。

行コメントは主に変数の説明、メソッド内の処理の説明で使用します。

ブロックコメント

「/* */」を使用します。プログラム中に「/*」が現れた場合、次に「*/」が現れるまでの部分を全てコメントとして扱います。

ブロックコメントは処理の説明や問題のありそうな場所を一旦無効にして実行したいとき等に使用します。

ドキュメントコメント

「/** */」を使用します。プログラム中に「/**」が現れた場合、次に「*/」が現れるまでの部分を全てコメントとして扱います。

ドキュメントコメントは主にクラス、フィールド、メソッドの説明に使用します。コメントの範囲はブロックコメントと同じですが、決められたルールに従って記述すればクラスのAPI(クラスの使用方法、説明が記述されたドキュメント)が自動生成することができます。

また、クラスの説明やメソッドのコメントには「@」から始まるアノテーションを使用することになりなります。どのアノテーションを使用するかは、開発のプロジェクト毎に決めていることもあり、開発前に決めていたほうが望ましいでしょう。

上記サンプルで使用しているアノテーション

  • @author クラスの作成者を記述する
  • @param メソッドの引数の説明を記述する
  • @return メソッドの戻り値の説明を記述する

 

この記事に関連する講座

エンジニア業務に必要な開発現場のリアルを身につけます。

詳しくはこちら


カテゴリー: Java プログラム

Javaでの正規表現(中級者向け)

letters-718846_640

Javaにおいて、ある文字列と文字列の一致を確かめるには、Stringクラスに定義されているequals()メソッドを使います。
しかし、それは文字列同士の完全一致の判定しか行う事ができません。

では文字列の部分一致、例えば ”h” から始まる文字列を調べるには、どのようにしたらよいでしょうか。
一言で ”h” から始まる文字列といっても “hello”, ”happy”, ”hot”, ”honey”, ”hawaii” …のように数多く存在します。

その条件、今回でいうところの『 ”h” から始まる文字列』を一つのパターンとし、それを表現する方法が正規表現です。

正規表現の使用方法

正規表現で『 ”h” から始まる文字列』を表すと、 ”h.*” のようになります。
ここで使用されている ”.” や ”*” はメタ文字と呼ばれるもので、プログラムの中で特別な意味を持った文字のことです。

例えば ”.” は、任意の一文字を表しています。アルファベットや数字、ひらがな漢字カタカナなど何らかの文字という表現になります。
そして続く ”*” は、直前の表現の0回以上の繰り返しを表します。こちらは ”*” の前に書かれたもの、今回で言うところの ”.” の繰り返しが0回以上続く、つまり ”h.*” という表現では、 ”h” の後に何らかの文字が0回以上続く文字を表しています。

これにより ”h.*” は ”hello” や ”happy”、極端にいえば ”h” 一文字だけという文字列も表現する事ができるのです。

この正規表現を使って文字の部分一致を判定する事を、「文字列のパターンに一致する」「パターンにマッチする」等と言います。

では、先程の例文字列 ”h.*” 一致するコードに表してみましょう。

String str = "hello";
String regex = "h.*";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);

if (matcher.find()){
   System.out.println("パターンにマッチしました");
   System.out.println(matcher.group());
}else{
   System.out.println("パターンにマッチしませんでした");
}

コードの解説です。
まず1行目で、文字列 ”hello” を変数strに格納しています。Patternオブジェクトのcompile()メソッドの引数に、正規表現を表す文字列パターンregexを渡して、正規表現を保持するPatternクラスのオブジェクトを生成しています。

4行目にPatternオブジェクトのmatcher()メソッドの引数に、判定対象となる文字列strを渡してマッチングしています。ここで引数に渡された文字列が正規表現パターンとマッチしていたら、Matcherオブジェクトとして取得されます。

6行目のif文の条件でMatcherオブジェクトのfind()メソッドが呼び出されています。
find()メソッドは、マッチした文字列があればtrueを、マッチした文字列が無ければfalseを返します。

8行目では、マッチした文字列の取得を行っています。

このように正規表現をJavaプログラム内で使用できる形式に変換するPatternクラス、指定されたパターンを使ってターゲットの文字列に対して様々な操作を行うMatcherクラスのメソッドを使い、特定の文字の正規表現を行う事が出来ます。
これらを使い名前の一致やURL、E-mailアドレスのパターンを表現し、文字列検索や文字の置き換えなどを行っていく事が可能になるのです。

その他の代表的なメタ文字例

直前の表現1回以上の繰り返しにマッチする。
直前の表現0回か1回にマッチする。
行頭にマッチする。
[ ]の中で使用した場合には、「以外」という意味になる。
行末にマッチする。
orの意味になり、この文字の左か右の文字にマッチする。
{ } 直前の表現の繰り返し回数を表す。{n}はn回、{n,}はn回以上、{n,m}はn回以上m回以下の繰り返しにマッチする。
[ ] [ ]内の1文字にマッチする。
( ) 表現内でのグループを作る。また、マッチした値を順番に取り出すことができる。
\ メタ文字を単なる普通の文字とし検索したい場合、メタ文字の前にこの記号を前に付けることで、メタ文字としての機能を打ち消し、表示不可能な文字や特定の意味を持った文字の集合にマッチする。
例:”\+”,”\?” など

また、Javaでは “\” をエスケープ(特殊な記号の前に記述して後に続く文字を認識させるための記号)として利用することがあります。 “\” を用いた正規表現での特殊文字についても確認しておきましょう。

\c{x} CTRL-“x”に該当するコントロール文字にマッチします。
xは大文字のXでも構いません。
\f フォームフィードにマッチします。
\n ラインフィード(改行コード)にマッチします。
\r キャリッジリターン(改行コード)にマッチします。
\s ホワイトスペース(空白・ラインフィード・キャリッジリターン・タブ・垂直タブなど)にマッチします。(”[\f\n\r\t\v]”とした場合と同じです。)
\S ホワイトスペース以外の文字にマッチします。(”[^\f\n\r\t\v]”とした場合と同じです)
\t タブにマッチします。
\v 垂直タブにマッチします。
\x{n} 文字コード”n”で表される文字1文字にマッチします。(”\x20”はスペースになります。)

なお、ここでご紹介したものはほんの一部です。
気になったパターンがあったら”正規表現 パターン”等で検索をかけてみましょう。


カテゴリー: Java プログラム