5
Collection list = new LinkedList(); // Good?
LinkedList list = new LinkedList(); // Bad?

最初のバリアントは柔軟性を高めますが、それだけですか? それを好む他の理由はありますか?パフォーマンスはどうですか?

4

6 に答える 6

7

これらは設計上の決定事項であり、通常、1 つのサイズですべてに対応できるわけではありません。また、メンバー変数の内部で使用されるものの選択は、外部の世界に公開されるものとは異なる場合があります (通常は異なるはずです)。

本質的に、Java のコレクション フレームワークは、実装の詳細を公開せずにパフォーマンス特性を記述するインターフェイスの完全なセットを提供しません。パフォーマンスを記述する 1 つのインターフェイスはマーカー インターフェイスであり、 APIを拡張したり再公開したりRandomAccessすることさえありません。ですから、良い答えはないと思います。Collectionget(index)

経験則として、重要な特性を認識 (および文書化) するまで、タイプをできるだけ具体的でないままにします。たとえば、挿入順序が保持されていることをメソッドに認識させたい場合は、すぐに から に変更しCollectionListその制限が重要である理由を文書化します。同様に、手前からの効率的な除去と言うなら移動から移動が重要になってきますListLinkedList

パブリック API でコレクションを公開する場合、私は常に、使用されることが予想されるいくつかの API だけを公開するようにしています。たとえばadd(...)、 とiterator().

于 2013-03-19T21:00:56.110 に答える
2

非パブリック オブジェクトの最も具体的な型情報を使用します。それらは実装の詳細であり、実装の詳細をできるだけ具体的かつ正確にしたいと考えています。

于 2013-03-19T20:52:10.853 に答える
2
Collection list = new LinkedList(); //bad

この参照で HashSet を参照したくないため、これは悪いことです (HashSet は Collection も実装しており、コレクション フレームワークの他の多くのクラスも実装しているため)。

LinkedList list = new LinkedList(); //bad?

これは悪いことです。なぜなら、常にインターフェースにコーディングすることをお勧めします。

List list = new LinkedList();//good

ポイント2日なので、これは良いです。(常にインターフェイスにプログラムします

于 2013-03-19T20:49:04.273 に答える
1

もちろん。たとえば、Java が List コレクションのより効率的な実装を見つけて実装するが、LinkedList のみを受け入れる API が既にある場合、この API のクライアントが既にある場合、実装を置き換えることはできません。インターフェイスを使用すると、API を壊さずに実装を簡単に置き換えることができます。

于 2013-03-19T20:50:15.970 に答える
0

私の一般的なルールは、その時点で必要なだけ具体的にすることです(または、合理的な範囲内で、近い将来に必要になるでしょう)。確かに、これはやや主観的です。

あなたの例では、私は通常、で利用可能なメソッドがあまり強力ではなく、aと別のメソッド(、など)の違いが論理的に重要でListあるという理由だけでそれを宣言します。CollectionListCollectionMapSet

また、Java 1.5以降では、raw型を使用しないでください。リストに含まれる型がわからない場合は、少なくともを使用してくださいList<?>

于 2013-03-19T20:59:58.800 に答える
0

それらは完全に同等です。どちらか一方を使用する唯一の理由は、クラス LinkedList にのみ存在する list の関数を後で使用する場合、2 番目を使用する必要があるためです。

于 2013-03-19T20:48:52.003 に答える