14

ジェネリックが出る前に、この質問が出されることは知っています。配列が戻り値の型を強制する場合、配列は少し勝ちます。よりタイプセーフです。

しかし今、最新のJDK 7では、このタイプのAPIを設計するたびに:

public String[] getElements(String type)
vs
public List<String> getElements(String type)

私はいつも、配列よりもコレクションを返すか、別の方法でコレクションを返す正当な理由を考えるのに苦労しています。API の戻り値の型として String[] または List を選択する場合のベスト プラクティスは何ですか? または、馬のコースです。

私は特別なケースを考えているわけではありません。一般的な長所と短所の比較を探しています。

4

5 に答える 5

14

パブリック API を作成している場合、通常、クライアントはコレクションを好みます。コレクションの方が操作が簡単で、残りのコードベースと統合できるからです。一方、パフォーマンスが非常に重要なコンテキストでパブリック API が使用されることが予想される場合は、未加工の配列が優先されます。

これを自分で使用するために作成する場合は、コレクション型から始めて、パフォーマンスに明確な問題がある場合にのみ配列に切り替えることをお勧めします。

配列の要素の型は実行時にリフレクションによって決定できるため、その特定の機能が重要な場合は、配列を優先する別のケースになります。

于 2012-11-29T10:53:59.980 に答える
12

ここに部分的なリストがあります

配列の利点:

  • 速い
  • 本質的に可変
  • 「何が得られるか」(型は何か) を正確に知っているため、返されたオブジェクトがどのように動作するかを正確に知ることができます。

リストの利点:

  • 動作は、返される実際の型によって異なります (たとえば、実際の型に応じて可変または不変になる場合があります)。
  • より良い雇用設計
  • (実際のタイプによっては) 動的サイズになる場合があります
  • より直感的hashCode()-equals()キーとしてハッシュベースのコレクションにフィードする場合、これは重要かもしれません。
  • 型安全性:

    String[] arr1 = new String[5]; 
    Object[] arr2 = arr1;
    arr2[0] = new Object(); //run time error :(
    List<String> list1 = new LinkedList<String>();
    List<Object> list2 = list1; //compilation error :)
    
于 2012-11-29T10:55:20.020 に答える
3

選択肢がある場合は、コレクションを選択します。これは、Java で「無料」で得られる追加の動作のためです。

インターフェイスへの実装

最大の利点は、Collection API (または List、Set など) を返す場合、メソッドを使用してクライアントを変更する必要なく、実装 (ArrayList、LinkedList、HashSet など) を簡単に変更できることです。

動作の追加

Java Collectionsクラスは、コレクションに適用できる多くのラッパーを提供します。

  1. コレクションの同期
  2. コレクションを不変にする
  3. 検索、反転など...
于 2012-11-29T11:00:02.913 に答える
0

パブリック API を公開する場合、Collection を返すことは非常に理にかなっています。コレクションで利用可能なあらゆる種類のメソッドを使用することで、クライアントの作業が楽になるからです。toArray()クライアントは、特別な場合に配列表現が必要な場合はいつでも呼び出すことができます。

また、ほとんどの API はコレクションを想定しているため、他のモジュールとの統合も容易になり、それも機能します。

于 2012-11-29T11:01:41.737 に答える
0

私の見解では、返された値が何に使用されるかによって異なります。

返された値が繰り返し処理される場合は、配列が最適ですが、結果が操作される場合は、適切なコレクションを選択してください。

ただし、たとえば、リストは重複を許可する必要がありますが、セットは許可しない、スタックは LIFO にする必要がありますが、キューは FIFO にする必要があります。実装だけが実際の動作を決定できるため、使用する必要があることに注意してください。

とにかく、それは本当に依存しています。

于 2012-11-29T11:02:04.603 に答える