私はこのようなコードを何度も見てきました:
List<String> list = new ArrayList<String>();
ArrayList生成されたオブジェクトの型ではなく、親 (および他のクラス) を取得するのはなぜですか?
それはより少ないパフォーマンスを必要としますか?または、なぜ誰かがこれをしなければならないのですか?
誰かがこのようなコードを書くとき、彼/彼女は次のような基本的な OO 設計原則に従おうとしています -
具体的な実装ではなく、インターフェイスへのプログラム
この原則については、ブログ投稿の 1 つで説明しています。セクションを見てくださいClass Inheritance VS Interface Inheritance。
投稿を要約すると、親タイプの参照を使用してサブタイプのインスタンスを参照すると、多くの柔軟性が得られます。たとえば、将来サブタイプの実装を変更する必要が生じた場合でも、コードの大部分を変更することなく、簡単に変更できます。
次の方法を検討してください -
public void DoSomeStuff(Super s) {
s.someMethod();
}
そしてこのメソッドへの呼び出し -
DoSomeStuff(new Sub());
現在、 内のロジックを変更する必要がある場合は、たとえばsomeMethodの新しいサブタイプを宣言し、その実装内のロジックを変更することで簡単に変更できます。このようにして、そのメソッドを利用する他の既存のコードに触れる必要はありません。次の方法でメソッドを引き続き使用できます-SuperNewSubTypeDoSomeStuff
DoSomeStuff(new NewSubType());
のパラメーターを of であると宣言した場合DoSomeStuff、Subその実装も変更する必要があります-
DoSomeStuff(NewSubType s) {
s.someMethod();
}
また、他のいくつかの場所にチェーン/バブルすることもあります。
コレクションの例に関して言えば、これにより、変数が指しているリストの実装をそれほど手間をかけずに変更できます。LinkedListの代わりに を簡単に使用できますArrayList。
あなたが書くとき:
List<String> list = new ArrayList<String>();
そうすれば、インターフェイス の機能のみを使用することになりますList。
(ArrayListを実装Listしているので、Listより柔軟です)。ArrayListこれを使用すると、将来、 を他のタイプ ( LinkedList.. など)に変更できます。
これは、 のみを使用できる厳格なモデルを作成するのではなく、 の型をインターフェイスlistを実装する任意の時点で交換できることを意味します。例えば:ListArrayList
private List<String> list;
public SomeConstructor()
{
// At this point, you can make it any type of object you want.
list = new ArrayList<String>();
list = new LinkedList<String>();
list = new AttributeList<String>();
}
これは、正確なオブジェクトの種類などの詳細から離れて、オブジェクトabstractを使用するコードになります。知っておく必要があるのは、メソッドなどを持っていることだけです。これはLoose Couplingと呼ばれます。listlistadd
メソッドは、使用するリスト実装を知る必要がないためです。
メソッドは、それがリストであることを知る必要があります。
メソッドは引き続き使用できます。
具体的な実装ではなく、常にインターフェイスに対してプログラムします。(この場合はリスト)
一般に、Interface クラス (Listこの場合) を使用して作業することをお勧めします。これにより、要件が変更された場合に、後で最小限の手間で List 実装を置き換えることができます。
ArrayListインターフェース上にないいくつかのメソッドをサポートしている可能性がありますListが、この宣言により、それらの余分なメソッドがその場合には関係ないことが明確になります。
List<String> list = new ArrayList<String>();
コレクションフレームワークListでは、インターフェースであり、ArrayList実装です。これを行う主な理由は、特定のインターフェイスからコードを分離することです。これは、将来 implementationの他の実装に移行する場合にも役立ちます。List