そのように多態的に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上記を考慮して、インターフェイスを使用してメソッド パラメーターと戻り値の型を宣言し、重要でない実装の詳細を隠し、制限を最小限に抑えます。パフォーマンスが非常に重要な場合、または提供される追加のメソッドが必要な場合にのみ、実際のクラスを使用してローカル変数を宣言します。後で別の具象クラスを選択した場合は、宣言と同じ行にある可能性が高いコンストラクターへの呼び出しを変更する必要があります。
はい。そして、それは他の回答が主張している「コーディングスタイル」の問題だけではありません...
ArrayListListにはインターフェイスが提供するよりも多くのメソッドがあるtrimToSize()ため (例: )、変数を として宣言すると、ArrayListそれらのメソッドにアクセスできるようになります。
一般に、これらの特別なメソッドにアクセスする必要がない限りList、具体的なものよりも抽象クラスを宣言するパターンに従って、それを として宣言することをお勧めします (LinkedList代わりに a を使用するなど、自由に実装を交換できます) 。