重複の可能性:
参照型としてのリストとArrayList?
私はStackOverflowのどこかでこれを読んだ:
List<String> foo = new ArrayList<String>();
ArrayListの初期化のベストプラクティスです。そしてこれは:
ArrayList<String> foo = new ArrayList<String>();
避けるべきです。これは正しいです?はいの場合、誰かがなぜそうなのか説明できますか?
ありがとう、EG
重複の可能性:
参照型としてのリストとArrayList?
私はStackOverflowのどこかでこれを読んだ:
List<String> foo = new ArrayList<String>();
ArrayListの初期化のベストプラクティスです。そしてこれは:
ArrayList<String> foo = new ArrayList<String>();
避けるべきです。これは正しいです?はいの場合、誰かがなぜそうなのか説明できますか?
ありがとう、EG
これは、ほとんどの開発者がArrayList
(私自身も含めて)使用する方法であり、ポリモーフィズムの一般的な信条です。すべての機能を利用できる状態で、可能な限りクラス階層の最上位のクラス/インターフェースを使用する必要があります。
List
一般に、これによりコードがより柔軟になり、タイプとしてのプログラミングでは、オンのみで使用できないメソッドを使用する必要がないことがわかっているため、実装をより簡単に切り替えることができArrayList
ますLinkedList
。
たとえば、私がした場合:
LinkedList<String> strings = new LinkedList<String>();
String s = strings.pop();
pop
は専用なLinkedList
ので、直接に変更することはできませんArrayList
。コードも変更する必要があります。
ArrayList<String> strings = new ArrayList<String>();
String s = strings.remove(strings.size() - 1);
しかし、インターフェイスを使用したばかりの場合はpop
、そもそも使用したことがなかったので、strings
必要な実装に変更することができました。
これは、APIをプログラミングするときに特に重要です。メソッドが公的にアクセス可能であり、他の開発者によって使用される場合は、特に理由がない限り、メソッドが取るリストの種類を制限していないことを確認する必要があります。使用したくない理由ArrayList
。
反復と追加/削除以外の何もしていない場合は、まで上がることもできますCollection
。ただし、ここではコンテキストが失われ始めList
ます。これは、重複が含まれている可能性があり、手動で注文されているためです。ただし、これが特に重要ではなくCollection
、を使用できる場合は、リストをの実装に置き換えることもできますSet
。
インターフェースの設計と呼ばれます。Listをパラメーターとして定義すると、コードは柔軟になります。ArrayListとLinkedListの両方(またはインターフェイスListを実装するその他のもの)を基礎となる実装として使用できます。
はい、最初のものは、クライアントでの最小限の変更で、後で実装を変更する柔軟性を提供します。
たとえば、に変更できますが、インターフェイスメソッドを使用する場合、クライアントへの影響は最小限に抑えられますArrayList
。LinkedList
List<String> tempList = new LinkedList<String>();