2013-08-28 2 views
6

下の2つの方法がどのようにArrayListを作成するには、次のとおりです。ArrayListを正しく作成するには?

List<String/*or other object*/> arrList = new ArrayList();//Imports List, ArrayList 
ArrayList<String/*or other object*/> arrList = new ArrayList();//Imports just ArrayList 

違いは何ですか?どちらの方法を使うべきですか?

+3

Formerでは、_abstraction_を活用できます。 – rocketboy

+2

明らかな答えは別として、あなたは輸入について心配するべきではありません。実行時のパフォーマンスには影響しません。 –

+1

[プログラムとインターフェイスすることは何であるか]を見てください(http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to -an-interface) – Pshemo

答えて

6

最初の形式は、クラスのパブリックインターフェイス(たとえば、クラス内の属性の宣言)に対して、をお勧めします。具体的な実装ではなく、インターフェース用にプログラムする必要があることはよく知られているアドバイスです(Design Patternsに記載されています)。インポートするクラスの数は、コードの品質やデザインとはほとんど関係ありません。

最初の形式の利点は、必要に応じて後で実装を簡単にスワップできることです.2番目の実装では実装クラスが石で設定されているため、コードを進化させにくくします。

具体的なクラスを宣言して使用することはできますが(たとえば、パフォーマンスが少し上がった場合など)しかし、クラスのパブリックインターフェイスは、可能な限りインターフェイスを使用する必要があります。これにより、将来の変更を実装しやすくなります。

+0

私は質問を読むと、数秒以内に、これや似たような回答を与える人がたくさんいると確信していました。しかし、プログラマーとしての15年間で、あなたが記述したルールを無視することによって生きている現実の問題は決してなかったし、それに従うことによって私はこれまで利益を得ていなかった。だからあなたはプログラミングのライブからの一例を持っていますが、実際には誰も決して決して奨励しません、決して決して具体的なクラスに対してプログラムを作ってはいけませんか? –

+0

@ KaiHuppmannパフォーマンス上の理由から、具体的なクラスを宣言して使用することは大丈夫です(たとえば、メソッドのローカル変数として)。しかし、クラスのパブリックインターフェイスは、インターフェイスの面で公開される必要があります。それは私によく役立った:) –

+0

@ KaiHuppmannよく彼らはすべて間違っている:) – ZhongYu

1

最初の例のように、Listインターフェイスを実装するすべてのデータ構造にリストを割り当てることができます。

これにより、実装を簡単に変更できるため、flexibilityがプログラムに追加されます。

2

まず方法は、実装にコーディングと呼ばれる

2つ目のインタフェースにコーディングと呼ばれています。

2番目の利点は、後でコードを変更することなく実装クラスを変更する柔軟性が得られることです。たとえば今日はArrayListを使用していますが、明日はLinkedListに変更したい場合は、単にリスト定義の埋め込みクラスを変更してください。

0

リストはインターフェイスです。 ArrayListは、Listインタフェースを実装するクラスです。

0

違いは、特定の実装を、Listを返すメソッドの呼び出し元から隠すことです。これは一般的に良い習慣です - あなたがListを返すと、後で他のコードを変更する波及効果を心配することなく、基礎となる実装を自由に変更することができます。 List.get(index)のようなリスト固有のものが必要ない場合は、さらにステップを進めて簡単に指定することもできますCollection<String> col = new ArrayList<String();

1

具体的なクラス(ArrayList)を自由に変更することができます。リストはあなたの仕事に適しています。 arrListを使用する他の場所では、ArrayListではなく、Listを実装するものがすべて必要であるため、その1行を変更するだけで済みます。あなたがその変更を行うことにした場合

番目のバージョンでは、あなたが上記のようにArrayList.

を期待するすべての場所を変更する必要があります、これはインタフェースにコーディングと呼ばれています。

0

ArrayListを作成する場合は、2番目のものだけが正しいとします。最初はListを作成します。これはArrayListクラスで実装されていますが、多くの状況で互換性がありません。 This questionはかなり良い答えがあります。世論に反して

+1

最初のオプションを使用して 'ArrayList'を作成することは完全に可能です。 – RaptorDotCpp

0

は、私たちはこの行は、実装の詳細である

ArrayList<X> list = new ArrayList<>(); 

第二の形式を使用する必要がありますと言います。実装の詳細については可能な限り具体的にする必要があります。

抽象化する必要があるパブリックAPIの一部ではありません。 「インタフェースに対するコード」の引数はここでは適用されません。私は多くの人々がインタフェースを使用することをお勧めしていることがわかります

0

、私は次のことを言うと思います:

  • あなたのコードを使用している人は本当にあなたが使用している実装の詳細を知っている必要があると考えられる場合は、具体的なクラスを使用してください。例えば、処理に特別な注意が必要なLinkedListなどの特定の実装を返すメソッドを持つ高性能ライブラリを作成している場合)。

  • ほとんどの場合、あまりにも詳細な情報が表示されないようにするには、インターフェイス。

関連する問題