3

そのように多態的にarrayListを宣言することの間に違いはありますか:

List<Integer> iL = new ArrayList<Integer>();

そしてそのような通常のスタイル:

ArrayList<String> stuff = new ArrayList<String>();
4

7 に答える 7

4

はい、違いがあります

List<Integer> iL ;

あなたができる

iL = new ArrayList<Integer>();

そしてまた

iL = new LinkedList<Integer>();

利点:

である他のオブジェクトを参照できます List


こちらもご覧ください

于 2012-05-26T20:26:13.953 に答える
3

通常、最初の宣言を使用することをお勧めします。インスタンス化の行を変更するだけで、リストの実装を簡単に変更できます。また、 が提供する追加機能を使用していないという意図も示していますArrayList

インターフェイスを使用するとパフォーマンス コストがいくらかかかりますが、最新の VM ではほとんど気にならないはずです。

于 2012-05-26T20:27:13.360 に答える
2

はい。2 番目のケースでstuffは、ArrayList になることしかできません。1 つ目は、インターフェイスiLを実装する任意のクラスのインスタンスにすることができListます。

于 2012-05-26T20:26:43.003 に答える
1

uはリスト機能などにしかアクセスできません。

于 2012-05-26T20:30:54.750 に答える
1

「インターフェースへのプログラム」などのこれらすべての標準的な答えは別として、あなたが書くArrayListことができた場所に書くことListは単に醜いので、あなたはそれをする理由があるほうがよいでしょう-そして99%の時間はありませんいずれかです。

于 2012-05-26T20:30:57.210 に答える
1

宣言でインターフェイスを使用する場合、いくつかの違いがあります。

  • 最低限重要なものを示します。具体的なサブクラスでのみ使用可能な特定のメソッドが必要な場合は、そのように宣言します。
  • 最小限の変更で別の実装 (LinkedListまたは) に交換できます。CopyOnWriteList
  • ポリモーフィズムによるわずかなパフォーマンスの低下。

上記を考慮して、インターフェイスを使用してメソッド パラメーターと戻り値の型を宣言し、重要でない実装の詳細を隠し、制限を最小限に抑えます。パフォーマンスが非常に重要な場合、または提供される追加のメソッドが必要な場合にのみ、実際のクラスを使用してローカル変数を宣言します。後で別の具象クラスを選択した場合は、宣言と同じ行にある可能性が高いコンストラクターへの呼び出しを変更する必要があります。

于 2012-05-26T20:35:47.053 に答える
1

はい。そして、それは他の回答が主張している「コーディングスタイル」の問題だけではありません...

ArrayListListにはインターフェイスが提供するよりも多くのメソッドがあるtrimToSize()ため (例: )、変数を として宣言すると、ArrayListそれらのメソッドにアクセスできるようになります。

一般に、これらの特別なメソッドにアクセスする必要がない限りList、具体的なものよりも抽象クラスを宣言するパターンに従って、それを として宣言することをお勧めします (LinkedList代わりに a を使用するなど、自由に実装を交換できます) 。

于 2012-05-26T20:27:57.497 に答える