2011-02-09 17 views
1

これはしばらく私を悩ませていて、まだ受け入れ可能な回答を見つけることができませんでした。いずれかのサブクラスであるか、私はこれが今だけ私にリストのメソッドへのアクセスを与えるのArrayListの面ではタイプ、すなわちJava変数型とインスタンス化

List list = new ArrayList(); 
Vehicle car = new car(); 

として親クラスやインターフェイスを使用する理由のインタフェースを実装するクラスを仮定。 Listをパラメータとして受け取るメソッドがある場合、ArrayListはListであるため、ListまたはArrayListを渡すことができます。メソッド内では明らかにListメソッドしか使用できませんが、Listという型を宣言する理由はわかりません。私が見る限りでは、コード内のどこかで使用できるメソッドに制限されています。

List list = new ArrayList()がArrayList list = new ArrayList()より優れているシナリオは、大変ご満足いただけます。

+0

重複? http://stackoverflow.com/questions/3768869/use-interface-or-type-for-variable-definition-in-java – Rich

答えて

1

親タイプの機能のみが必要な場合は、インターフェイスまたは親タイプを使用することが一般的には、をお勧めします。アイデアは、あなたが実際に実装を気にしないことを明示的に文書化することで、後で別のクラスの具象クラスを簡単に交換することを容易にします。あなたはいつもの代わりに、例えばListSetなどを使用している場合

良い例では、JavaコレクションクラスですArrayListの場合は、後でArrayListからLinkedListに切り替えることができます。よりよい性能。これを行うには、コンストラクタを変更するだけです(それらをすべて変更する必要はなく、混在することもできます)。コードの残りの部分はまだListというインスタンスがあり、作業を続行します。

実際にArrayListを明示的に使用した場合は、使用する場所を変更する必要があります。実際にArrayListが必要ない場合は、インターフェイス上で使用することによって得られるものは何もありません。

これは一般的に推奨されています(たとえば、「Effective Java」(J.Bloch)、Item 52:「オブジェクトによるインタフェース参照」など)。

また、この関連の質問を参照してください。Why classes tend to be defined as interface nowadays?

+0

有効なJavaで間違った項目を引用しています。アイテム52を意味します:「オブジェクトをそのインターフェースで参照する」。 Item 19は、インタフェースとマーカインタフェースの定数を扱います。 –

+0

他のすべてが同じコンセプトを打ちましたが、これを最も完全な回答として受け入れます。この説明をありがとう。効果的には、コードの柔軟性とメンテナンスが重要です。すなわち、Listの別の実装への変更がどこでも有効です。どうもありがとう。 – andyfinch

+0

もちろん、これは実際にはローカル変数の問題ではありません。 –

1

キーは、インターフェイスまたは基本クラスあなたは変数で何ができるか制限していることを正確です。たとえば、後でコードをリファクタリングして、そのインタフェースまたは基本クラスの別の実装を使用する場合は、実際の型のIDに頼らず、恐れることはありません。

もう1つのことは、コードを読みやすくするためです。メソッドの戻り値の型がListの場合は、Listの変数を返すと読みやすくなります。

2

あなたはいくつかのクラスとメソッドの周りにリストを渡すプログラムを書く。マルチスレッド環境で使用したいと考えています。あなたは賢明だったとList、すべてを宣言した場合、あなたは今、コードの1行に単一の変更することができます:あなたはArrayListとしてリストを宣言した場合

List list = Colllections.synchronizedList(new ArrayList()); 

を、あなたの代わりにあなたの全体を再書き込みする必要がありますプログラム。ストーリーのモラルは、常にあなたのコードが要求する最も制限の少ないインターフェースにプログラムします。

1

インタフェースは契約を指定します(このことは何をしますか)。実装クラスは実装の詳細を指定します(どのように実装するか)。

良いOOPプラクティスによれば、アプリケーションコードは他のクラスの実装の詳細に結び付けるべきではありません。

また、インタフェースを使用すると、異なる実装におけるクライアントコードパスをすることができますし、Collections.unmodifiableList()など、Collections.synchronizedList()よう

1

シナリオをメソッドを使用して、Decoratorパターンを適用します。インターフェースを使用すると、疎結合アプリケーションを保持(Couplingを読みます) ListList = new ArrayList()はArrayListよりも優れています list = new ArrayList()は多くの場合 になります。

一つの具体的な例:それはフィールド宣言だとあなたはもちろん柔軟にListパラメータを取る必要がありますsetList()を、持っている場合。

ローカル変数(およびセッターのないフィールド)の場合、インターフェイスタイプの使用にはほとんど特記がありません。とにかく一般原則で多くの人がそれをやるでしょう。

+0

ローカル変数とプライベートフィールドの利点は少ないですが、内部リファクタリングの利点はまだあります。また、厳密にプライベートなフィールドは今日明日セッターを成長させるかもしれません、そして、インターフェイスを使用すると役に立つでしょう。 – sleske

+0

また、* intent *(可能な限り)をコードに記述する必要があります。インタフェースを使用する場合は、現時点で特定の型を使用するつもりはないと表現しています。 – sleske

+0

@sleske:それは理論です。実際には、本当に、本当に1ビットは関係ありません。ローカル/プライベート変数の型を変更することが困難な場合は、コードに何が問題なのかをインタフェース型では必ずしも確認できません。 –

0

あなたは正しいです。これらの場合、変数はフィールドまたはローカル変数です。ではなく、パブリックインターフェイスです。実装の詳細です。実装の詳細を詳述する必要があります。実装のために意図的に選択しただけなので、ArrayListをArrayListと呼びます。

決まり文句をリサイクルする人々:あなたの投稿を見て、もう少し考えてみてください。ナンセンスです。

死にdownvotedた私の前の回答:

Use interface or type for variable definition in java?

+0

はい、ローカルフィールドではそれほど重要ではありませんが、メソッドの内部でも同じ利点が適用されます。とにかくメソッド内の変更が簡単であるため、問題はそれほどありません。 Personall、私はインターフェイスを使うのは良い習慣だと思っています。それをいつもそうするのは簡単です。 – sleske

関連する問題