有効ですか?つまり、連絡先内でIterator
、前の反復と同じ(可変)オブジェクトを返すか、前のオブジェクトとして可変状態を共有する新しいオブジェクトを返すか。つまり、next()
文書化されている限り、前の呼び出しによって返されたオブジェクトを無効にするために1つの呼び出しを行うことができますか?
私はこれが一般的に良い考えではないことを完全によく理解しています、そして私はそれを習慣にしません。
ただし、同じ基になるオブジェクト、または内部が共有されている新しいオブジェクト(したがって、以前に返されたオブジェクトの内部を無効にする可能性があります)を再利用すると、重要で測定可能な場合があります。良い例は、イテレータから返されたオブジェクトが、オフセットと長さを持って、を含むバッファ配列に保持されているIterable
場合です。この配列は、後続のオブジェクトが取得されるときに上書きされる可能性があります。
確かに、これは驚き最小の原則に違反しており、クライアントに不親切かもしれませんが、それが連絡先に違反しているかどうか知りたいのですが、それIterator
を文書化する限り、私はルールの範囲内で遊んでいますか?
javadocはコレクションに焦点を当てて作成されているようです。呼び出し間で状態を共有することnext()
はおそらく無意味ですIterator
が、汎用インターフェースです(バッキングコレクションなしで、またはバッキングなしでも実装できます)。
基本的に、私はフライウェイトパターンに匹敵する、パフォーマンスの面で何かを実装しようとしていますが、Javaイテレータの優れた点を維持しています。
このパターンに従うイテレータは、次のように安全に使用できます。
for (Foo foo : FooIterable) {
if (foo.method()) {
System.println("ha!");
}
}
の各インスタンスはfoo
、ある反復から別の反復にエスケープすることはありません。ただし、次のようなものは一般的には機能しません。
List<Foo> allTheFoos = ...;
for (Foo foo : FooIterable) {
allTheFoos.add(foo);
}
for (Foo foo : allTheFoos) {
...
}
最初のループのfoo
sは格納されているため、反復を回避できます。後でそれらにアクセスすると、それらの状態が無効になる可能性があります(たとえば、foo
最初の反復から最後に返されたように見える場合があります。