(1)ジェネリック型
ジェネリック型とは、Javaコード上の「型名」をパラメータ化し、
コンパイル時に任意の型名で置き換えるメカニズムである。
コレクションにはあらゆるオブジェクトを格納できる。
なぜならコレクションに要素を追加するaddメソッドの引数や、
Iteratorからオブジェクトを取り出すnextメソッドの戻り値が、
いずれも「Object型」として定義されているからだ。
だが使用する際にキャストが必要だったり、
型チェックが行われないためにClassCastExceptionが発生したいする問題がある。
こうした問題を解決するのがジェネリック型である。
J2SE 5.0では以下のようなコードが書けるようになった。
List<String> list = new LinkedList<String>();
list.add("Hello,");
list.add("World!");
for (Iterator<String> it = list.iterator(); it.hasNext();) {
String msg = it.next();
System.out.println(msg);
}
(2)新しい「forループ」
コレクションを逐次処理するループをとても簡単に記述できるようになった。
この新しいforループを使えば、上記コード例のforループ部分は以下のように記述できる。
for (String msg : list) {
System.out.println(msg);
}
これはつまり、「コレクションからIteratorを取得する」
「Iteratorに要素が残っているか調べる」
「Iteratorから次の要素を取得する」という一連の処理のコーディングをすべて省略できる。
(3)プリミティブ型を自動変換する「オートボクシング」
オートボクシングは、intやdoubleなどのプリミティブ型とIntegerやDoubleなどのラッパクラス間の相互変換を自動化する機能だ。
例えば以下のようなコードを書けるようになる。
List list = new LinkedList();
list.add(123);
従来、2行目の部分は「list.add(new Integer(123));」と記述していた。
コレクションはプリミティブ型のデータを格納できないので、
Integerオブジェクトでラップしなくてはならないからだ。
一方J2SE 5.0では、上記のようなコード部分で必要に応じてオートボクシングが働くため、
ラッパクラスに変換するコードを書く手間が掛からない。
(4)「メタデータ」で
アノテーションが可能に
Javaコード上にさまざまなアノテーション(注釈)を記述するための仕組みが追加された。
このアノテーションを使えば、Javaコードだけでは伝え切れない付加的な情報をコンパイラや
開発ツールに伝達できる。
コンパイラによるコードのチェックをはじめ、コードやドキュメント自動生成、DI(Dependency Injection)などに応用が可能だ。
最も分かりやすい例が@Overrideアノテーションである。
@Override
public String toString() {
...
}
@Overrideアノテーションを記述しておけば、確実にオーバーライドされていることをコンパイラ・レベルでチェックしてくれる。
(5)標準入出力のフォーマット
C言語のprintf風のフォーマット機能。手軽な文字列の整形が可能だ。
System.out.printf("%s %5d%n", user, total);
(6)可変長引数のサポート
メソッド呼び出し時の可変長引数のサポート。例えば以下のように、引数の型に続いて「...」と記述すれば、任意数の引数を受け取って配列としてアクセスできる。
public void test(String ... msgs) {
for (int i = 0; i < msgs.length; i++) {
System.out.println(msgs[i]);
}
}
最終更新:2007年01月26日 18:13