0

重複の可能性:
インターフェイスへのコーディング?

コレクションのチュートリアルを Java から読んでいますが、コレクションを参照するコードは、実際の実装タイプではなく、そのインターフェイス タイプを使用して実装することを強くお勧めします。例えば:

Set<String> s = new HashSet<String>();

後で実装を変更することにした場合に、実装を変更する柔軟性が得られると書かれています。

Set<String> s = new TreeSet<String>();

柔軟性以外に、インターフェイス型を使用してコレクションを実装する利点はありますか?

4

3 に答える 3

4

はい、インターフェイス クラスを使用する場合、ほとんどのデフォルト メソッドにしかアクセスできません。これらの方法は直感的であることを保証します。実装クラスを使用すると、混乱したり悪用されたりする可能性のあるメソッドがさらに表示される場合があります。

例: コレクション インターフェイスには、要素の数を返すメソッドがありますsize()。ただし、実装クラスはcapacity()、基になる配列の大きさを示すメソッドも提供する場合があります。

しかし、チュートリアルで説明されているように、最も重要な理由は、何の努力もせずに実装を変更できることです。実装の変更は、パフォーマンスの最適化が非常に特殊なケースであるため、興味深い場合があります。

于 2012-12-06T12:54:26.163 に答える
1

ここでは、コレクションだけでなく、ポリモーフィズムについても考えています。実行時にバインドされるように実装や具象クラスを変更できるため、宣言された型としてインターフェイスを使用することをお勧めします。(ここでの議論はもっと長くなる可能性があります-これに関するドキュメント/チュートリアルはたくさんあります-Javaの基本)

于 2012-12-06T12:55:07.513 に答える
1

多くの場合、インターフェイス型には実際の実装よりも少ないメソッドが含まれており、それらにアクセスできるため、後者を使用したくなります。

ただし、これにより、かなりの方法で手を結ぶことができます。たとえばVector、ベクトルを使用するクラスのパブリック メソッドからの戻り値の型を公開することに決めたが、後でモジュールが を使用した方が適切であることに気付いたLinkedList場合、いくつかの問題が発生します。ベクトルを返すメソッド。

一方、最初に戻り値の型を使用していた場合はList問題ありません。内部の Vector を LinkedList に切り替えるか、インターフェイス List を満たす独自のものを実装できます。私の経験では、これはよくあることです (もちろん、それを難し​​くしたり不可能にしたりすれば、起こりにくくなります)。

そのため、特別な理由がない限り(ベクトルでのみ使用可能なメソッドへのアクセスを提供する必要がある場合など)、戻り値には常にジェネリック インターフェイス型を使用してください。

これはまだ柔軟性に関するものであることは理解していますが、それがどれほど重要かを理解しているかどうかは、あなたの投稿からは明らかではありません. インターフェースを使用するより良い理由を求めている場合、つまり. 「柔軟性を気にしないのであれば、特定の実装を使用しても大丈夫ですか」、つまり。「柔軟性は気にせず、特定の型を使いたいのですが大丈夫ですか?」答えは、柔軟性を気にする必要があるということです;) 他の人が言ったように、これは優れた Java プログラミングの重要な基本です。

于 2012-12-06T13:03:03.110 に答える