1

以下のようにコレクションオブジェクトを使用する方が良いと常に言われています

1)List st = new LinkedList();

2)Map mp = new HashMap();

よりも

3)LinkedList st = new LinkedList();

4)HashMap mp = new HashMap();

上記 (1,2) のように定義することで同意します 同じ変数 (st,mp) をList,Mapインターフェイスの他のオブジェクトに再割り当てできます

LinkedListしかし、ここでは、でのみ定義されているメソッドを使用することはHashmapできません。(着用している場合は修正してください)ListMap

HashMapしかし、またはのオブジェクトを定義している場合はLinkedList、これらの特別な機能に使用したいと考えています。

次に、コレクションオブジェクトを作成する最良の方法は( 1,2 )

4

5 に答える 5

10

ほとんどの場合、特別なメソッドは必要ないからです。特別なメソッドが必要な場合は、明らかに特定の型を参照する必要があります。

今日の教訓: 自分の頭脳を使わずにプログラミングの原則をやみくもに適用しないでください。

于 2013-01-18T16:38:31.490 に答える
3

しかし、HashMap または LinkedList のオブジェクトを定義している場合は、これらの特別な機能に使用したいと考えています。

その場合、具象クラスを使用して変数を絶対に宣言する必要があります。それはいいです。

代わりにインターフェイスを使用するポイントは、そのインターフェイスによって公開された機能のみが必要であることを示し、後で実装を変更する可能性があることを示すことです。(ただし、パフォーマンスと、選択した具体的な実装の動作への影響にも注意する必要があります。)

于 2013-01-18T16:38:38.447 に答える
1

インターフェイスを通じて、サービス コントラクトを定義します。あなたが言うように、特定のインターフェースの下位実装を変更する場合、現在のコードに影響を与えることなく問題なく変更できます。

特定のクラスの特定の動作が必要な場合は、それらを使用するのが絶対に正しいです。AbstractMapマップは通常、それ自体が実装するクラスを拡張しMap、サブクラスにそれらのメソッドを継承させます。

もちろん、多くのクラスはインターフェイスIllegalOperationExceptionのいくつかの定義済みメソッドをスローするMapため、実装タイプの変更が常に完璧であるとは限りません (ただし、ほとんどの場合、各マップには特定のアセットがあり、特定のコンテキストに最も適切な選択になるためです)。 )。

誰かが正しいと言っているタイプではなく、自分に合ったタイプを使用してください。すべてのルールには例外があります。

于 2013-01-18T16:42:45.110 に答える
1

上記 (1,2) のように定義することで同意します 同じ変数 (st,mp) を List,Map インターフェイスの他のオブジェクトに再割り当てできます

はい、それはインターフェイスに対するプログラミングと呼ばれる一般的な方法です。

しかし、ここでは LinkedList でのみ定義されているメソッドを使用できません。 Hashmap は List,Map には表示されないため正しいです。(着用している場合は修正してください)

いいえ、あなたは正しいです。

しかし、HashMap または LinkedList のオブジェクトを定義している場合は、これらの特別な機能に使用したいと考えています。

次に、コレクションオブジェクトを作成する最良の方法は( 1,2 )

これは最善の方法ではありません。これらのクラスの特定のメソッドを使用する必要がある場合は、具象型への参照が必要です。内部実装を認識していないと思われるクライアント クラスからこれらのコレクションを使用する必要がある場合は、インターフェイスのみを公開することをお勧めします。

于 2013-01-18T16:39:33.517 に答える
0

インターフェイスを使用してコレクションにアクセスする場合、実装を自由に変更できるからです。たとえば、LinkedList の代わりに ArrayList を使用するか、その同期バージョンを使用します。

これは主に、クラスのパブリック インターフェイスにコレクションがある場合に当てはまります。内部的には気にせず、必要なものを使用するだけです。

于 2013-01-18T16:39:04.133 に答える