今回はJavaのトリビアです。
JavaSE5.0からfor-each構文が使えるようになりました。
List<String> list;
for (String str : list) {
// ...
}
上記のようなコードになるのですが、for-eachでループを書くには対象となるコレクションが
java.lang.Iterableを実装している必要があります。
java.util.ListインターフェースはIterableインターフェースのサブインターフェースとして
定義されていますから、Listの実装は全てfor-eachでループさせることができます。
このIterableインターフェースですが、定義されているメソッドは
Iterator iterator()
というものだけです。つまり、Iterableであるということはjava.util.Iteratorを返すことが出来るということを意味します。
Iterator自身はIterableではない!
Iteratorインターフェースを使うことで順番にオブジェクトが取得できるわけですが、
このIterator自身はIterableではないのでfor-each構文でループさせることが出来ません。
自前でIteratorの継承クラスを作った場合、そのままではfor-eachでループさせられないのです。
そこで自前のIteratorにIterableもimplementsしてやり、thisを返すようにしてやります。
import java.util.Iterator;
public class SampleIterator implements Iterator<String>, Iterable<String> {
/** @see java.lang.Iterable#iterator() */
public Iterator<String> iterator() {
// 自分自身を帰すことでfor-eachでループできるようにする
return this;
}
/** @see java.util.Iterator#hasNext() */
public boolean hasNext() {
// ... (略)
}
/** @see java.util.Iterator#next() */
public String next() {
// ... (略)
}
/** @see java.util.Iterator#remove() */
public void remove() {
// ... (略)
}
}
このようにしてやらないとfor-eachでループできないのです。なんだか不思議ですね。
投稿日時 : 2007年9月20日 12:52