連載
» 2005年01月19日 10時00分 公開

JavaTips 〜Javaプログラミング編:J2SE 5.0で簡略化されたfor文

[佐藤匡剛,@IT]

 2004年9月末にリリースされたJ2SEの新版(J2SE 1.4の次のバージョン)は、本来であればJ2SE 1.5と称されるはずが「J2SE 5.0」と命名されました。このバージョン番号が示すように、J2SE 5.0の開発環境(以下、JDK 5.0)では、これまでにない数々の大きな改良が加えられています。

 JDK 5.0の新機能の多くは、EoD(Ease of Development:開発を容易にすること)というテーマの基に導入されたものです。Javaがもともと持っていた型の安全性の性質は強化しながら、よりシンプルにコードを記述できるような改良が、多く盛り込まれています。本稿では、そのうちの1つである「簡略化されたfor文」について説明します。

従来の煩雑なfor文

 これまでは、配列やコレクションの各要素を取り扱うには、以下のようにコードを記述しました。

配列の場合
String[] strs = new String[3];
strs[0] = "eins";
strs[1] = "zwei";
strs[2] = "drei";
for (int i = 0; i < strs.length; i++) {
  // 各要素を扱う処理
  System.out.println(strs[i]);
}


コレクションの場合
Collection strs = new ArrayList();
strs.add("eins");
strs.add("zwei");
strs.add("drei");
for (Iterator it = strs.iterator(); it.hasNext(); ) {
  String str = (String) it.next();
  // 各要素を扱う処理
  System.out.println(str);
}


 このように、for文の度にインデックスや反復子(iterator)を宣言しなければなりませんでした。そのため、for文が入れ子になっているような複雑な操作をする場合には、見通しが悪くバグの温床になりがちでした。

 また、コレクションの場合には、リストの赤字部分に示すように各要素を取り出す際にクラスキャストが必要でした。これは単に1行追加しなくてはならないというだけでなく、誤ったクラスキャストをコードに忍び込ませてしまう原因になるものでした。クラスキャストの誤りはコンパイル時には検証できないものなので、検出しにくいバグを生み出す温床となります。

新たに拡張されたfor文

 JDK 5.0では、上述に示した従来の書き方に加えて、以下のような非常にシンプルな書き方ができるようになりました。

拡張されたfor文
for (String str : strs) {
  // 各要素を扱う処理
  System.out.println(str);
}


 for文の「:」の右側には、配列またはコレクションを置くことができ、左側には各要素の型と変数名とを宣言します。

 この式で、配列またはコレクションのすべての要素に対して、順に処理が行われます。また、各要素のクラスは、for文のカッコの中(「(String str : strs)」)ですでに宣言されているので、以降の明示的なキャストが必要なくなります。

 ここで示したサンプルコードを実行すると、上記3つのいずれの場合でも、以下のような結果が得られることになります。

実行結果
eins
zwei
drei


 お分かりのように、for文の拡張は従来にない処理を記述可能にしたのではありません。よりシンプルなコードの記述を可能にしたまでです。プログラマが定型的なコードを書かなくてもよいので、プログラムをより簡単に記述することができ、かつバグの可能性も排除できることになります。これがJDK 5.0で目指されたEoDの一端です。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。