12

次のように、人々が新しい ArrayList をインスタンス化し、それを List インターフェイスに割り当てるコードに出くわします。

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

このアプローチの背後にある理由は何ですか?

4

4 に答える 4

18

インターフェイスの特定の実装からコードを切り離す。

Listこれは、将来インターフェースの別の実装に移行する際にも役立ちます。

例えば ​​-

後で、インターフェイスList<String> names = new ArrayList<String>();の他の実装を使用する必要があったと判断しました。たとえば、変更するだけで何も壊れません。ListLinkedListList<String> names = new LinkedList<String>();

于 2013-07-03T23:12:33.657 に答える
4

このようなコードはクラスを使用せず、変数type として宣言します。これを抽象化といいますListList

Listどの実際のクラスが使用されるかを指定せずに、実際のクラスが持つメソッドを定義するinterfaceです。

ここでは大したことではありませんが、このプラクティスは非常に重要であり、より複雑な状況では不可欠です。常にこのパターンに従うことをお勧めします。

于 2013-07-03T23:16:03.157 に答える
4

実装ではなくインターフェースへのプログラミング

ギャング・オブ・フォー(GoF)のデザインパターンです。何故ですか?

具体的な実装ではなく、抽象的な契約によってガイドします。

public class MyClass {

    private List myList ;

    public setMyList(List list){
        myList=list;
    }

}

ArrayList実装したい実装の代わりにどうLinkedListですか?そうすれば、セッターでそのプロパティを注入するだけで済みます。

抽象化が鍵です。仕様によるガイドのみの実装については何も知りません。

これを読んでくださいインターフェイスへのプログラミングとはどういう意味ですか?

于 2013-07-03T23:11:36.700 に答える
3
List<String> names = new ArrayList<String>();

これにより、 interface に対してコードを記述Listできるため、必要に応じて将来的に実装を簡単に切り替えることができます。

その場合、以下で十分です -

List<String> names = new //some other implementation of List

今、あなたが次のように何かをするなら -

ArrayList<String> names = new ArrayList<String>();

実装ArrayList自体に対してコーディングします。そして、コードはその特定の実装に関連付けられています。実装を切り替える必要がある場合は、多くのコード変更が必要になります。

ドキュメントをチェックして、Java 6 によって提供される標準実装の一部を見つけてください。

于 2013-07-03T23:13:22.243 に答える