forループの拡張はGenerics機能に付随してなされたものだと思いますが、それほど 大きな拡張というわけではありませんし、これによってソースコードが大々的に 簡単になる、というほどのものでもありません。ま、ちょっと便利になったかも、 という感じですか。
これまでだと、例えばStringを要素とするjava.util.List
があって、これをプリントするのであれば、
void printStringList(List list) { Iterator iter = list.iterator(); while (iter.hasNext()) { String s = (String) iter.next(); System.out.println(s); } }てな感じで、Iteratorを使ってぐるぐる回していたのですが、これが拡張されたforループの機能を使うと、
void printStringList(List<String> list) { for (String s : list) { System.out.println(s); } }のように書けます。Iteratorを媒介させることなく(実際にはIteratorで回しているのですが)個別の要素にアクセスできるようになります。もちろんGenericsの機能により、個別の要素のクラスも決まってきます。
拡張forの機能は、特にループが多重になった場合の可読性向上に役立ちます。もっとも構造上やむをえない場合を除いて、何重ものループを使ってプログラムを作成する事の方が問題なわけで、そのことへの配慮なくして可読性をあげてもしょうがないと思いますが。
またJDKの文書でも触れられてますが、明示的にIteratorが出てこないため、Iteratorのメソッド(remove()など)を使う必要のあるループでは使えません。残念。
ちなみにIteratorで回すことができるかどうかは、5.0からはjava.lang.Iterable
を実装しているかどうかで判断できるようになりました。拡張forループ機能を使いたい場合はIterableを実装しておけばよいわけです。java.util.List
を親intefaceであるjava.util.Collection
なんかもIterableをextendsするように変更されています。
それと、forループの拡張はIterableなオブジェクトだけでなく配列に対してもつかるようになっています。
void printStringArray(String[] array) { for (String s : array) { System.out.println(s); } }てな具合ですね。配列のインデクス変数を省略することができています。この場合も何番目の要素なのかが必要なプログラムの場合は使えませんが。