3

So many time I have seen that instantiation of Arraylist is done in the manner "

List<Object> listObject = new ArrayList<Object>();

So I am wondered that what is the significance of instantiation of Arraylist in this way? What happens if we instantiate ArrayList() like

ArrayList<Object> listObject = new ArrayList<Object>();

You could use some of the existing plugins such as jGrowl or noty.

4

10 に答える 10

9

Listはインターフェースであり、ArrayListクラスはそのインターフェースの特定の実装です。

List<Object> listObject = new ArrayList<Object>();

Listこれにより、将来的に実装を変更できます。List listObjectインターフェイスで宣言されたすべてのメソッドを呼び出すことができListます。ArrayList将来、 の実装を望まず、Lista と言って変更する場合はLinkedList、それを行うことができます:

List<Object> listObject = new LinkedList<Object>();

asインターフェイス型listObjectを宣言した場合は、を使用するコードを変更する必要はありません。また、この宣言でに固有のものを使用した可能性があるため、残りのコードが壊れる心配もありません。listObjectListArrayList

ArrayList<Object> listObject = new ArrayList<Object>();

これは、実装ではなくインターフェースへのプログラミングと呼ばれます。

于 2013-06-12T06:45:29.760 に答える
3

これは、実装ではなくインターフェースにコードを書くことが常に良い習慣であるという事実によるものです。そのため、List<Object> listObject = new ArrayList<Object>();いつでも ArrayList を LinkedList に変更する自由があり、コードの他の場所は変更する必要はありません。したがって、ここでインターフェース (List) にプログラミングすることで、コード内の他の場所に影響を与えることなく、基礎となる実装を変更する自由/力が得られます。より明確にするために、この小さなメモを読むことをお勧めします。

于 2013-06-12T06:47:05.660 に答える
1

コードを変更せずに、同じものの異なる実装を使用できるためinterface(この場合、 List 実装をlinkedListではなく に変更することができArrayListます)。

Java クラスのインターフェースを優先する必要があるのはなぜですか?

于 2013-06-12T06:50:44.400 に答える
1

Java 7の時点で、これらは既知の実装です。List

すべての既知の実装クラス:
AbstractList、AbstractSequentialList、ArrayList、AttributeList、CopyOnWriteArrayList、LinkedList、RoleList、RoleUnresolvedList、Stack、Vector

ArrayListAbstract クラスはさておき、これが意味することは、将来、さまざまなオプションがある以外に別の List 実装をプラグインしたい場合です。

Coding to Interfacesこれは、広く使用されているプログラミング パラダイムとも呼ばれます。

于 2013-06-12T06:50:58.593 に答える
1

リストはインターフェイスです。インターフェイスを参照として定義するときはいつでも、その実装を使用してインスタンス化する必要があります。

于 2013-06-12T06:59:20.340 に答える
1

使用するときは、 AbstractionListを使用します。関数呼び出しが期待されるケースをイメージするList<Object>

List<Object> myList = myFunction();

関数 myFunction() では、使用する方が良い

List<Object> myList = new ArrayList<Object>();
return myList;

よりも

ArrayList<Object> myList = new ArrayList<Object>();

不必要なキャストを避けることができるからです。List呼び出し元の関数は、その実装に関係なく のみを期待します。

さらに、Listインターフェースは、すべての実装に適用できる多くの汎用関数を提供します。したがって、リストが であるか であるかに関係なく、リストを操作する一般的なコードを書くことができます。を使うメリットです。 LinkedListArrayListAbstraction

于 2013-06-12T06:52:45.390 に答える
1

どちらの例でも、リストの実装に違いはありません。ただし、コードで変数 myList をさらに使用できる方法には違いがあります。

リストを次のように定義すると:

 List myList = new ArrayList();

List クラスに属するメソッドと参照メンバーのみを呼び出すことができます。次のように定義した場合:

ArrayList myList = new ArrayList();

ArrayList 固有のメソッドを呼び出し、List から継承されたメンバーに加えて ArrayList 固有のメンバーを使用できるようになります。

それにもかかわらず、ArrayList でオーバーライドされた最初の例の List クラスのメソッドを呼び出すと、List のメソッドではなく、ArrayList のメソッドが呼び出されます。

それはポリモーフィズムと呼ばれます。

于 2013-06-12T06:45:21.900 に答える
1

これは、「実装ではなくインターフェイスにプログラムする」

これこれを見てください

于 2013-06-12T06:45:55.587 に答える
1

ListはインターフェースでありArrayList、クラスです。ベスト プラクティスは次のとおりです:具体的なクラスではなく、インターフェイスに対してプログラムします

実際には、これら 2 つの定義 (変数の型をインターフェイスとクラスとして定義) に違いはないかもしれませんが、を使用Listすると、コードがクラスではなくインターフェイスに依存するようになります。その後、変数を使用しているコードに影響を与えることなく、変数の実際の型を後で変更できます。

于 2013-06-12T06:48:24.040 に答える