2013-04-03 8 views
12

のJava 5以来、私たちのようなforeach文で使用できる新しいjava.lang.Iterableタイプがあります。複数の使用法に関するIterableインタフェースの公式契約はありますか?

for (Object element : iterable); 

反復処理可能の処分の前にそのiterator()メソッドが複数回呼び出すことができるかどうかを指定していないIterable契約。

for (Object element : iterable); 
for (Object element : iterable); 

は、例えば、Iteratorラッピングの実装は2回使用することはできません:

​​

ほとんどの場合Iterablesが、これはすなわち、次のようにすべてのIterablesのために働くことが期待できるかどうかは明らかではありませんこれは実際にはList,SetのようなコレクションAPIの型にあてはまり、すでにiterator()メソッドの定義済みのコントラクトを持っているため、無関係です。

私のOneShotIterable実装は、私が見落としている契約に違反していますか?言い換えれば、のユーザーはそれを再利用できると期待していますか?もしそうなら、Java 5の専門家グループが「ワンショット」Iterables(2回目の呼び出しでIllegalStateExceptionを投げるなど)に対処する方法を「公式」に勧告していますか?

+2

+1 utterable – TheBlastOne

+0

iterator()が呼び出されるたびにOneShotIterableのフィールドを増やすことはできませんでしたか?それがgte nの場合は例外をスローしますか? – sp00m

+0

@LukasEder dohあなたはそれを編集しました – TheBlastOne

答えて

14

標準ライブラリにある先例の1つはDirectoryStreamです。

そのJavadocは、以下の通路(強調彼ら)が含ま:DirectoryStreamIterableを拡張

ながら、単一Iterator担体として、それは汎用Iterableないと、 iteratorメソッドを呼び出して2番目以降のイテレータを取得すると、IllegalStateExceptionがスローされます。私に

、これは二つのことを示唆している:

  • Iterable上の暗黙の契約は、あなたが複数回反復することができるようになっているということです
  • A(おそらく同時に!) 太字警告では、IllegalStateExceptionが投げられると警告が表示され、おそらく独自のクラス/インターフェイスで非準拠を処理する最適な方法です。
1

そうでもない私の質問への答えですが、Apache Commonsのコレクションは、そのIteratorUtilsクラスでこの問題に対処しています:

はどちらIteratorIterableタイプのファクトリメソッドです。上記の区別は、IteratorsIterablesにラップするときに注意する必要があることを明確にします。

関連する問題