1

Collectionsユーティリティ クラスには、static methodsで動作するものがありcollectionます。たとえば Collections.Sort(list)、リストを並べ替えます。

タイプのメソッドではない理由

static <T> Iterator<T> iterator() { }

このようにして、コレクションに対してイテレータを取得できます

Iterator it = Colletions.iterator(list)

コレクションには がありますがemptyIterator() and emptyListIterator()、どのような目的に役立つのかわかりません。

4

4 に答える 4

2

インターフェイスには既にを返すメソッドがあるCollections.iterator(Collection)ため、メソッドは必要ありません。すでに があり、とにかくが と結合されている場合にのみ意味があります。どうする?おそらく単に を呼び出すだけです。Collectioniterator()IteratorCollectionIteratorCollectionCollections.iterator(Collection c)return c.iterator();

空の/を作成する処理を呼び出し元に保存して、Collections.emptyIterator()その/メソッドを呼び出すだけだと思います。Collections.emptyListIterator()CollectionListiterator()listIterator()

GRASP パターン「Information Expert」は、クラス自体が を作成するために必要な情報を持っているため、の設計はIteratorそれが反復するクラスで行われることを示しますIterator

于 2013-11-05T20:55:01.770 に答える
2

Collection Interfaceで既に定義されているため、 iterator メソッドは必要ありません。異なる Collection クラスの場合、イテレータは同じ機能を (外部的に) 提供しても (内部的に) 同じようには機能しないため、そうする必要があります。

[編集。ありがとう、マルコ。] 空のイテレータを使用すると、よりクリーンなコードを記述できるため、特別なエッジ ケースをカバーする必要がなくなります。空のイテレータを提供する方法は 1 つしかありません。したがって、定義済みの動作を使用して Collections クラスで定義されます。

于 2013-11-05T20:53:43.087 に答える
1

「空のイテレータの目的」の部分だけお答えします。

次の方法を検討してください。

boolean containsEvil(String x) {
  return x.contains("evil");
}

このメソッドは、null 引数の場合に失敗します。これは特殊なケースであり、失敗を回避するには特別な処理が必要です。ただし、プログラムの残りの部分で引数を使用しないように注意し、null「文字列なし」の概念を空の文字列として表す場合は、特別なケースを処理する必要はありません。

Iterator場合によっては、ベースの APIを使用することもできます。

boolean containsEvil(Iterator<String> xs) {
   while (xs.hasNext()) if (containsEvil(xs.next()) return true;
   return false;
}

繰り返しますが、これは null 引数では失敗するため、「イテレータなし」の場合を表すために、空のイテレータファクトリを周囲に用意する必要があります。より広い意味で言えば、文字列空間でゼロ要素を必要とするのと同じように、イテレータ空間でゼロ要素が必要です。

于 2013-11-05T21:49:43.150 に答える
1

しかしCollection.iterator()、それはまさにあなたが探しているものです。

このCollectionsクラスには、すべての種類のコレクションに共通する一連のユーティリティ メソッドが含まれていますが、Collectionインターフェイスを実装するすべてのコレクションには、特定の機能の特定の実装が含まれています。

それぞれCollectionがすでに独自のイテレータを持っているため、Collections実装が簡単であることに加えて、 でユーティリティ メソッドとして使用しても意味がありません。受け取った as パラメータiterator()でメソッドを呼び出した結果を返すだけです。Collection

于 2013-11-05T20:53:48.770 に答える