これら2つに違いはありますか?もしそうなら、それは何ですか?
List<Integer> x = new ArrayList<Integer>();
と
ArrayList<Integer> x = new ArrayList<Integer>();
これら2つに違いはありますか?もしそうなら、それは何ですか?
List<Integer> x = new ArrayList<Integer>();
と
ArrayList<Integer> x = new ArrayList<Integer>();
最初の宣言により、インターフェースをプログラムできます。これにより、後で安全に を置き換えることができArrayList
、LinkedList
残りのコードはコンパイルされます。
ArrayList
2 番目の宣言では、クラスにプログラミングできるため、インターフェイスを実装しないメソッドを使用できる可能性がありList
ます。たとえば、 として宣言されたリストでは呼び出すことができますがensureCapacity()
、 として宣言されたリストでは呼び出すことができArrayList
ませんList
。一般的にはインターフェイスへのプログラミングが推奨されますが、クラス固有のメソッドを呼び出さなければならない場合は、それを行っても問題はありません。たとえば、ensureCapacity()
リストの新しいターゲット サイズがわかっている場合、呼び出す機能により、不要な再割り当てを節約できます。
インターフェースにコーディングする場合は、あまり手間をかけずに実装を変更できます
List<Integer> x = new ArrayList<Integer>();
たった 1 行のコードで x を LinkedList またはその他の List の実装を指すようにすることができます。ArrayList にある特定のメソッドが必要な場合は、左側に ArrayList を配置しても問題ありません。100 人中 99 人がそうは思わないので、リストが優先されます
andをArrayList
指定できるintitalsize
ので、ArrayList にはtrimToSize()
そのサイズを現在のサイズにトリミングするメソッドがList<Integer>
あります。キャストし直さない限り、サイズをトリミングすることはできません。ArrayList
前者が好ましい。フィールドに依存するコードを変更せずに実装を変更できます。
ジョシュア・ブロッホは『Effective Java』で次のように述べています。
適切なインターフェイス タイプが存在する場合、パラメーター、戻り値、変数、およびフィールドはすべて、インターフェイス タイプを使用して宣言する必要があります。
...
インターフェイスを型として使用する習慣を身につければ、プログラムはより柔軟になります。