次のように、人々が新しい ArrayList をインスタンス化し、それを List インターフェイスに割り当てるコードに出くわします。
List<String> names = new ArrayList<String>();
このアプローチの背後にある理由は何ですか?
次のように、人々が新しい ArrayList をインスタンス化し、それを List インターフェイスに割り当てるコードに出くわします。
List<String> names = new ArrayList<String>();
このアプローチの背後にある理由は何ですか?
インターフェイスの特定の実装からコードを切り離す。
List
これは、将来インターフェースの別の実装に移行する際にも役立ちます。
例えば -
後で、インターフェイスList<String> names = new ArrayList<String>();
の他の実装を使用する必要があったと判断しました。たとえば、変更するだけで何も壊れません。List
LinkedList
List<String> names = new LinkedList<String>();
このようなコードはクラスを使用せず、変数をtype として宣言します。これを抽象化といいますList
List
List
どの実際のクラスが使用されるかを指定せずに、実際のクラスが持つメソッドを定義するinterfaceです。
ここでは大したことではありませんが、このプラクティスは非常に重要であり、より複雑な状況では不可欠です。常にこのパターンに従うことをお勧めします。
実装ではなくインターフェースへのプログラミング
ギャング・オブ・フォー(GoF)のデザインパターンです。何故ですか?
具体的な実装ではなく、抽象的な契約によってガイドします。
public class MyClass {
private List myList ;
public setMyList(List list){
myList=list;
}
}
ArrayList
実装したい実装の代わりにどうLinkedList
ですか?そうすれば、セッターでそのプロパティを注入するだけで済みます。
抽象化が鍵です。仕様によるガイドのみの実装については何も知りません。
これを読んでくださいインターフェイスへのプログラミングとはどういう意味ですか?
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 によって提供される標準実装の一部を見つけてください。