そのように多態的にarrayListを宣言することの間に違いはありますか:
List<Integer> iL = new ArrayList<Integer>();
そしてそのような通常のスタイル:
ArrayList<String> stuff = new ArrayList<String>();
そのように多態的にarrayListを宣言することの間に違いはありますか:
List<Integer> iL = new ArrayList<Integer>();
そしてそのような通常のスタイル:
ArrayList<String> stuff = new ArrayList<String>();
はい、違いがあります
と
List<Integer> iL ;
あなたができる
iL = new ArrayList<Integer>();
そしてまた
iL = new LinkedList<Integer>();
利点:
である他のオブジェクトを参照できます List
こちらもご覧ください
通常、最初の宣言を使用することをお勧めします。インスタンス化の行を変更するだけで、リストの実装を簡単に変更できます。また、 が提供する追加機能を使用していないという意図も示していますArrayList
。
インターフェイスを使用するとパフォーマンス コストがいくらかかかりますが、最新の VM ではほとんど気にならないはずです。
はい。2 番目のケースでstuff
は、ArrayList になることしかできません。1 つ目は、インターフェイスiL
を実装する任意のクラスのインスタンスにすることができList
ます。
uはリスト機能などにしかアクセスできません。
「インターフェースへのプログラム」などのこれらすべての標準的な答えは別として、あなたが書くArrayList
ことができた場所に書くことList
は単に醜いので、あなたはそれをする理由があるほうがよいでしょう-そして99%の時間はありませんいずれかです。
宣言でインターフェイスを使用する場合、いくつかの違いがあります。
LinkedList
または) に交換できます。CopyOnWriteList
上記を考慮して、インターフェイスを使用してメソッド パラメーターと戻り値の型を宣言し、重要でない実装の詳細を隠し、制限を最小限に抑えます。パフォーマンスが非常に重要な場合、または提供される追加のメソッドが必要な場合にのみ、実際のクラスを使用してローカル変数を宣言します。後で別の具象クラスを選択した場合は、宣言と同じ行にある可能性が高いコンストラクターへの呼び出しを変更する必要があります。
はい。そして、それは他の回答が主張している「コーディングスタイル」の問題だけではありません...
ArrayList
List
にはインターフェイスが提供するよりも多くのメソッドがあるtrimToSize()
ため (例: )、変数を として宣言すると、ArrayList
それらのメソッドにアクセスできるようになります。
一般に、これらの特別なメソッドにアクセスする必要がない限りList
、具体的なものよりも抽象クラスを宣言するパターンに従って、それを として宣言することをお勧めします (LinkedList
代わりに a を使用するなど、自由に実装を交換できます) 。