私はJavaが初めてで、ネット上の多くの例のコードを調べてみると、ほとんどすべての場合にArrayList
単純に変数を宣言している人がいます。List
List<String> myList = new ArrayList<String>();
これを行うことの特定の利点があるかどうかはわかりません。ArrayList
次のように、それ自体にできないのはなぜですか。
ArrayList<String> myList = new ArrayList<String>();
私はJavaが初めてで、ネット上の多くの例のコードを調べてみると、ほとんどすべての場合にArrayList
単純に変数を宣言している人がいます。List
List<String> myList = new ArrayList<String>();
これを行うことの特定の利点があるかどうかはわかりません。ArrayList
次のように、それ自体にできないのはなぜですか。
ArrayList<String> myList = new ArrayList<String>();
これは、インターフェイスへのプログラミングと呼ばれます。これにより、どこかで a の方が適切であると判断した場合に、それArrayList
を aに置き換えることができます。LinkedList
LinkedList
後で変更することにした場合は、次のほうが簡単です。
List<String> myList = new ArrayList<String>();
List<String> myList = new LinkedList<String>();
返されるものを変更すると、関数を使用しているすべての人がコードを変更することを余儀なくされる可能性があるため、メソッド シグネチャではより重要です。
List はインターフェースであるため、List Interface から拡張されたすべてのクラスへの参照を格納できます。次のステートメントを使用した場合、いくつかのプログラミング手順の後に、他のオブジェクト (List から拡張) 参照も格納できます。
List<String> myList = new ArrayList<String>();
...
myList =new LinkedList<String>();
これに伴う主な利点は、コードのメンテナンスです。たとえば、だれかが ArrayList の代わりに LinkedList を使いたいと思った場合、コード全体で無数のコードを変更するのではなく、1 行だけ変更する必要があります。これにより、コードが少し柔軟になります。
Java におけるポリモーフィズムの概念全体は、インターフェイス/基本クラス参照を使用してサブクラス オブジェクトを参照する Java の機能に依存しています。
また、実際の実装ではなくインターフェイスへのプログラミングは、常にベスト プラクティスと見なされます。これにより、開発者は、必要に応じて、ある実装を他の/より優れた実装に簡単に置き換えることができます。
これはキャストではなく、宣言された変数の型としてインターフェイスを使用しています。これを行う理由は、使用している List の実装を切り替えることができるためです。リストのユーザーが List インターフェイスのみに依存している場合、LinkedList などの別のリスト タイプを使用しても影響を受けません。
Java は厳密に型付けされたオブジェクト指向言語です。.... 例を見てみましょう: sort 関数を書いているとしますsort(ArrayList<> list)
。関数がそのように宣言されている場合、Java は、その関数を使用して .xml 以外のものをソートすることを許可しませんArrayList
。より良いアプローチは、抽象化を定義すること です(あなたの質問のように)List
。その抽象化では、メソッドを宣言します。すべての実装が実装定義する必要があること (つまり、ArrayList)。これで、sort
関数を as として宣言できるようになり、実装する (そしてメソッドのコントラクトに従う)sort(List<> list)
ものは何でも並べ替えることができます。
このようにして、すべての実装で作成したコードを再利用できますList
List
抽象化の契約に従う限り。Java では、インターフェイスを抽象化として、クラスを実装として使用してこれを実現します。他にも利点がありますが、それらをよりよく理解したい場合は、オブジェクト指向プログラミングに関する本を読んだことがあります。
1)List
はインターフェースで、実装クラスはArrayList
2) List
インターフェース extendsCollection
です。