4

すべての Collections 関数の出力を Iterable 型に変更することに関するあなたの意見を知りたいだけです。

これはおそらく、最近の Java で最も一般的なコードのように思えます。誰もが 99% の確率で常に List/Set/Map を返しますが、次のようなものを返す標準であってはなりません。

    public final Iterable<String> myMethod() {
            return new Iterable<String>() {
                  @Override
                  public Iterator<String> iterator() {return myVar.getColl();}
            };
    }

これはまったく悪いことですか?あなたはすべてのDAOクラスを知っており、これは次のようになります

    Iterable<String> getName(){}
    Iterable<Integer> getNums(){}
    Iterable<String> getStuff(){}

それ以外の

    List<String> getName(){}
    List<Integer> getNums(){}
    Set<String> getStuff(){}

結局のところ、99% は for ループで使用します...

どう思いますか?

4

3 に答える 3

3

これは非常に悪い計画になります。

90% の確率で for ループで使用しているは言えません。たぶん40-50%。それ以外の場合は、より多くの情報が必要です: sizecontains、またはget(int)

さらに、戻り値の型はそれ自体が一種のドキュメントです。を返すSetと、要素が一意であることが保証されます。List要素が一貫した順序になるドキュメントを返します。

HashSetまたはのような特定のコレクションの実装を返すことはお勧めしませんが、オプションが利用可能な場合は、通常はまたはではなくまたはArrayListを返すことを好みます。SetListCollectionIterable

于 2012-05-14T10:00:24.203 に答える
2

List、Set、Mapはインターフェースであるため、特定の実装に関連付けられていません。したがって、それらは型を返すための良い候補です。

List/etcとIterable/Iteratorの違いは、アクセスの種類です。1つはランダムアクセス用で、すべてのデータに直接アクセスできます。Iterableを使用すると、すべてのデータを利用できるようにする必要がなくなります。大量のデータがあり、すべてをインプレースにするのが効率的でない場合に最適です。例:大規模なデータベース結果セットを反復処理します。

したがって、アクセスしているものによって異なります。データが膨大になる可能性があり、パフォーマンスの低下を回避するために反復が必要な場合は、イテレータを使用してデータを強制します。その他の場合、リストは問題ありません。

編集:イテレータを返すということは、他の可能性なしにアイテムをループすることだけができることを意味します。パフォーマンスを確保するためにこのトレードオフが必要な場合は、OKですが、前述のように、必要な場合にのみ使用してください。

于 2012-05-14T10:02:34.843 に答える
0

あなたがコーディングしたものは部分的に正しいです:

次のようなアイテムのいくつかのメソッドでテストする必要があります。

  1. size
  2. contains()
  3. get(index)
  4. exists()

したがって、新しいアーキテクチャについて再考するか、このメソッドでオーバーライドして、必要なものを毎回取得する必要があります。

于 2012-05-14T10:05:30.503 に答える