J2SEの次期リリース版である5.0。
今までのようなマイナーバージョンアップではなく、大幅な言語仕様修正が入りました。
なんたって(1.5ではなく)5.0ですから。
以下、その主な内容です。
これが、一番大きな修正点でしょう。
簡単に言うと、コレクションの「型」を指定できるようになりました。
以下のようなロジックがあったとします。
List list = new ArrayList();
list.add("abc");
list.add("def");
for (Iterator it = list.iterator() ; it.hasNext()) {
String s = (String)it.next();
System.out.println(s);
}
これが Generics を適用すると以下のようになります。
List<String> list = new ArrayList<String>();
list.add("abc");
list.add("def");
for (Iterator<String> it = list.iterator() ; it.hasNext()) {
String s = it.next();
System.out.println(s);
}
ListやIteratorの後に <String> という記述があります。
これにより、Listに格納するオブジェクトの型を決定できるという訳です。
addメソッドに渡すパラメータは String クラスのインスタンスである必要があります。
Iteratorから値を取り出すときも、面倒なキャストが必要ありません。
C++を知ってる人ならば誰もが判ることですが、
この機能はまさにC++の「テンプレート」そのものです。
テンプレートは高機能ですが、使い方によっては
かなりの可読性が失われる危険性もあります。
使いどころには注意する必要がありそうです。
上の例は、この Enhanced for loop を適用するとさらに簡単にすることが出来ます。
for文の部分を以下のように記述できます。
for (String s : list) {
System.out.println(s);
}
うーん、便利ですね。ただ、個人的にコロン(:)はどうかと思いますが…
まずは以下のコードを見て下さい。
public static void main(String args[]) {
Map<String, Integer> m = new TreeMap<String, Integer>();
for (String word : args)
m.put(word, m.get(word) + 1);
System.out.println(m);
}
これは、パラメータargsに指定した英文から
使われた単語の種類と頻度を計測するプログラムです。
注目すべきは、
m.get(word) + 1
という部分です。これは本来なら、
Integer freq = m.get(word);
if (freq == null) {
m.put(word, new Integer(1));
} else {
m.put(word, new Integer(freq.intValue() + 1));
}
と記述していたはずです。
先の一文はこれと同等の動きをします。
C++ではお馴染みの enum が使えるようになりました。
これは、定数を列挙した型のことで、以下のように使います。
public enum Coin {
penny, nickel, dime, quarter;
}
...
return Coin.penny;
enum内で定義された変数は全てpublic staticとなります。
定数クラス(インターフェイス)の扱い方が明確になりました。
以前のJavaでは、
public interface Physics {
int OK = 0;
int NG = 1;
}
public class Guacamole implements Physics {
..
int i = OK;
}
のように定数をインターフェイスで宣言して、
定数を使用するクラスでこのインターフェイスを実装するという形が多く取られていました。
しかし、この使い方は antipattern とされているように使用するのは好ましくありません。
インターフェイスとは本来、一連の動作(メソッド)を抽象化するために用いるもので
定数のみを宣言したものをインターフェイスとして使うのは良くないことなのでしょう。
そこで、Static import を適用すると以下のように書けます。
import static org.iso.Physics.*; ... int i = OK;
import宣言の後に static というキーワードが付いています。
これにより、Physicsインターフェイスで宣言されている定数をimportすることが出来ます。
ちなみに、この場合Physicsはクラスとして宣言する方が良いとされています。
public final class Physics {
public static final int OK = 0;
public static final int NG = 1;
}