オブジェクトの宣言に関する混乱

私はCoreJavaの本でコレクションを学習していて、私はこのコードを見つけました:

      List a = new LinkedList();

今私はなぜこのコードがこのようなものではないのだろうかと思います。

LinkedList a = new LinkedList();

a をListとして宣言する理由は何ですか?

0

5 答え

List is the interface, LinkedList is a specific implementation of the interface. "Program to an 'interface', not an 'implementation': http://en.wikipedia.org/wiki/Design_Patterns#Introduction.2C_Chapter_1

4
追加された

LinkedList に特有の操作を使用する必要がある場合は、2番目のコードが機能します。しかし、この必要性は通常非常にまれです。最初のほうがより一般的です。これにより、1行だけを変更することによって異なる List 実装を使用することができます。他のコード(メソッドパラメータなど)は変更する必要はありません。

P.S. LinkedList は、 List の具体的な実装です。

4
追加された

コード:

List list = new LinkedList();

よりも良い:

LinkedList list = new LinkedList();

これは、 listList として宣言し、プログラムのパフォーマンスが悪いことが判明した場合、コードを次のように変更することができます:

List list = new ArrayList();

プログラムがより速く実行されるかどうかを確認してください。これの美しさは、コードの残りの部分を変更することなくその変更を行うことができることです。

結論として、可能であれば、参照をインタフェースList )インタフェースとして宣言します。

List list;

List クラスと class LinkedList はインターフェイス List の実装です)を簡単に切り替えることができます:

list = new LinkedList();

または

list = new ArrayList();
3
追加された

の別の良い例。

    

なぜリストとして宣言するのですか?

  

方法を考えてみましょう:

public void doStuff(LinkedList llObj){} 

これは、ユーザーがLinkedListを渡すことだけを許可するメソッドの制限を示しています。

public void doStuff(List listObj) {} 

このメソッドは任意のListを渡すことができます。

お役に立てれば。

1
追加された

Javaでは、他のすべてのOOP言語と同様に、設計の主な強みの1つは多態性です。ポリモーフィズムはメソッドだけでなく、クラスにも拡張され、サブタイプ、ポリタイピングなどの名前を取ります。

あなたの最初のコード例では:

List a = new LinkedList();

参照変数 'a'の型を、 'List'型の任意の具体的な拡張子にします。

次のコードサンプルの場合は、

LinkedList a = new LinkedList();

参照変数 'a'は、 'LinkedList'型の任意の拡張子をとることができます。

To understand the power of this we should check the type hierarchy of LinkedList: http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html

したがって、最初の例では、 'a'を「List」の具体的な型に参照するスコープを増やします。これにはLinkedListも含まれています.2番目の例では、LikesListとそのサブタイプのみを入力します。

1つは他のものより優れていませんが、多くの場合、コードの設計とアプリケーションでは、どのアプローチが最適なユースケースに適しているかが不満です。

いくつかの良い読書:

Subtyping Polymorphism: http://en.wikipedia.org/wiki/Polymorphism_(computer_science)#Subtyping

0
追加された