30

私はこのようなコードを何度も見てきました:

List<String> list = new ArrayList<String>();

ArrayList生成されたオブジェクトの型ではなく、親 (および他のクラス) を取得するのはなぜですか?

それはより少ないパフォーマンスを必要としますか?または、なぜ誰かがこれをしなければならないのですか?

4

7 に答える 7

42

誰かがこのようなコードを書くとき、彼/彼女は次のような基本的な OO 設計原則に従おうとしています -

具体的な実装ではなく、インターフェイスへのプログラム

この原則については、ブログ投稿の 1 つで説明しています。セクションを見てくださいClass Inheritance VS Interface Inheritance

投稿を要約すると、親タイプの参照を使用してサブタイプのインスタンスを参照すると、多くの柔軟性が得られます。たとえば、将来サブタイプの実装を変更する必要が生じた場合でも、コードの大部分を変更することなく、簡単に変更できます。

次の方法を検討してください -

public void DoSomeStuff(Super s) {
    s.someMethod();
}

そしてこのメ​​ソッドへの呼び出し -

DoSomeStuff(new Sub());

現在、 内のロジックを変更する必要がある場合は、たとえばsomeMethodの新しいサブタイプを宣言し、その実装内のロジックを変更することで簡単に変更できます。このようにして、そのメソッドを利用する他の既存のコードに触れる必要はありません。次の方法でメソッドを引き続き使用できます-SuperNewSubTypeDoSomeStuff

DoSomeStuff(new NewSubType());

のパラメーターを of であると宣言した場合DoSomeStuffSubその実装も変更する必要があります-

DoSomeStuff(NewSubType s) {
    s.someMethod();
}

また、他のいくつかの場所にチェーン/バブルすることもあります。

コレクションの例に関して言えば、これにより、変数が指しているリストの実装をそれほど手間をかけずに変更できます。LinkedListの代わりに を簡単に使用できますArrayList

于 2013-08-20T07:31:53.547 に答える
13

あなたが書くとき:

List<String> list = new ArrayList<String>();

そうすれば、インターフェイス の機能のみを使用することになりますList
(ArrayListを実装Listしているので、Listより柔軟です)。ArrayListこれを使用すると、将来、 を他のタイプ ( LinkedList.. など)に変更できます。

于 2013-08-20T07:34:27.867 に答える
12

これは、 のみを使用できる厳格なモデルを作成するのではなく、 の型をインターフェイス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

于 2013-08-20T07:31:43.453 に答える
4

メソッドは、使用するリスト実装を知る必要がないためです。

メソッドは、それがリストであることを知る必要があります。

メソッドは引き続き使用できます。

具体的な実装ではなく、常にインターフェイスに対してプログラムします。(この場合はリスト)

于 2013-08-20T07:32:23.820 に答える
3

一般に、Interface クラス (Listこの場合) を使用して作業することをお勧めします。これにより、要件が変更された場合に、後で最小限の手間で List 実装を置き換えることができます。

ArrayListインターフェース上にないいくつかのメソッドをサポートしている可能性がありますListが、この宣言により、それらの余分なメソッドがその場合には関係ないことが明確になります。

于 2013-08-20T07:32:31.743 に答える
2
List<String> list = new ArrayList<String>();

コレクションフレームワークListでは、インターフェースであり、ArrayList実装です。これを行う主な理由は、特定のインターフェイスからコードを分離することです。これは、将来 implementationの他の実装に移行する場合にも役立ちます。List

于 2013-08-20T07:31:36.153 に答える