0

重複の可能性:
Java クラスのインターフェースを優先する必要があるのはなぜですか?

私はJavaに比較的慣れていないので、コレクションフレームワークを始めたばかりです。ArrayList私は人々がそれを宣言する2つの方法に遭遇しました。たとえば、ArrayListof Strings を宣言するには:

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

また

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

これら2つのどちらを使用する必要があり、それらの違いは何ですか?

呼び出される実際のメソッドは実行時に決定されるため、呼び出されるメソッドはすべてArrayListクラスのみになりますが、最初の宣言は呼び出すことができるメソッドを制限します。

最初の方法は、「インターフェースへのコーディング」と呼ばれていると聞きました。任意のメソッドは変数を使用して呼び出されるため、インターフェイスlによって提供されるメソッドのみを呼び出すことができますが、2 番目の例では、クラスだけでなくクラスによって提供されるすべてのメソッド ( など) も呼び出すことができます。そもそも、なぜ人々は最初の宣言を使用するのでしょうか??ListListObjectfinalize()wait()

4

2 に答える 2

4

可能な限り特定性の低いインターフェイスを常に使用する必要があります。これにより、より適切な実装が存在する場合に代替実装を簡単に置き換えることができます。たとえばList、リストがリンクされたリストか配列リストかを気にしないメソッド。より適切な方を選択できます。

于 2012-06-12T15:01:17.250 に答える
2

私は個人的に使用をお勧めしますList<String> l = new ArrayList<String>();

その理由は、通常、ArrayList を操作していることを知る必要がないからです。リストのように動作するものが必要なだけです。ArrayList には、人々がアクセスする必要のない多くの動作があります。「EnsureCapacity」を検討してください。彼らはそれを必要としません - リスト操作が必要なだけです。原則として、データと機能の公開は "知る必要がある" 基準で制限する必要があり、リストのユーザーは (既定では) どの実装を使用したかを知る必要はありません。

たとえば、LinkedList ではなく ArrayList を使用していることを彼らが知る必要がある場合は、List 参照ではなく ArrayList 参照を使用することをお勧めします。ただし、ほとんどの場合、これは必要ありません。

于 2012-06-12T15:02:28.923 に答える