私はこのようなコードを何度も見てきました:
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
の新しいサブタイプを宣言し、その実装内のロジックを変更することで簡単に変更できます。このようにして、そのメソッドを利用する他の既存のコードに触れる必要はありません。次の方法でメソッドを引き続き使用できます-Super
NewSubType
DoSomeStuff
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
を実装する任意の時点で交換できることを意味します。例えば:List
ArrayList
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と呼ばれます。list
list
add
メソッドは、使用するリスト実装を知る必要がないためです。
メソッドは、それがリストであることを知る必要があります。
メソッドは引き続き使用できます。
具体的な実装ではなく、常にインターフェイスに対してプログラムします。(この場合はリスト)
一般に、Interface クラス (List
この場合) を使用して作業することをお勧めします。これにより、要件が変更された場合に、後で最小限の手間で List 実装を置き換えることができます。
ArrayList
インターフェース上にないいくつかのメソッドをサポートしている可能性がありますList
が、この宣言により、それらの余分なメソッドがその場合には関係ないことが明確になります。
List<String> list = new ArrayList<String>();
コレクションフレームワークList
では、インターフェースであり、ArrayList
実装です。これを行う主な理由は、特定のインターフェイスからコードを分離することです。これは、将来 implementation
の他の実装に移行する場合にも役立ちます。List