0

このパターンは Java および C# コードでよく見られるので、何らかの理由で「ベスト プラクティス」だと思いますが、その理由はわかりません。したがって、たとえばJavaでは...

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

これは (明らかに) 1 つの場所でのみ宣言され、コードの 1 つのブロックでのみ適用されますが、ポイントは何ですか? なぜ言わない...

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

...?

4

2 に答える 2

1

はい、それがベストプラクティスです。コードの後半で、クライアント コードを変更して、LinkedList<String>または変更せずに実装を変更できるためです。CustomListImpl<String>

メソッドを持つサードパーティのライブラリを使用しているとします。

ArrayList<Document> getAllDocuments(){...}

この場合、ライブラリの作成者が に変更ArrayListするとLinkedList、すべてのコードが壊れます (コンパイル エラーが発生します)。

ArrayList<Document> list = getAllDocuments()//compilation error here

ライブラリメソッドがインターフェイスで宣言される場合

List<Document> getAllDocuments(){...}

また、作成者は実装をLinkedListコードに変更して問題なく動作します。例:

List<Document> list = getAllDocuments()//you do not worry here about implementation

したがって、を使用すると、実装レベルではなく抽象化レベルInterfacesでプログラムを作成できます

于 2013-08-01T22:51:42.437 に答える
1

aは、インターフェイスList<String>で使用可能なすべてのメソッドに応答できるオブジェクトを宣言するためです。Listは、その特定のArrayList実装で使用できるメソッドをさらに持つことができます。

宣言する

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

に固有のメソッドを使用できるようになりますArrayListArrayListしかし、ある日、これが問題の最善の解決策ではないことに気付いたとしましょう。もしあなたが持っていたら

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

次に、直接変更できます

List<String> list = new LinkedList<String>();

コード内の他のものを壊さないことが保証されてlistList<String>ます.

一般に、特定のタイプについて想定することは少なく、それが最適です。これは、インターフェースだけでタイプとインターフェースしているため、正確なタイプや追加機能は気にせず、インターフェースによって提供されるメソッドを気にするだけです。もちろん、その特定の機能を使用する必要がある場合があるため、これが常に可能であるとは限りません。

于 2013-08-01T22:52:06.863 に答える