web-dev-qa-db-ja.com

Java)でLinkedListを宣言する

私はいつも、コレクションを宣言するときにInterface ob = new Class()を学びます。たとえば、LinkedListを使用したい場合は、List ob = new LinkedList()を実行しますが、アクセスできません。 LinkedListのすべてのメソッド..LinkedList ob = new LinkedList()は100%正しくありませんか?

10
Márcio Duarte

LinkedList ob = new LinkedList()は100%正しくありませんか?

ジェネリック形式を使用することをお勧めしますが、確かに-固有からLinkedListまでの機能を使用する場合は、それに応じて変数を宣言します。

Deque<E> または Queue<E> インターフェースはあなたが望むものを持っています。含まれている場合は、使用する実装ではなく、必要なものを説明するという考えに沿ってそれらを使用してください。

11
Jon Skeet

はい、

LinkedList<...> items = new LinkedList<...>();

itemsLinkedList<T>インターフェースでキャプチャされないList<T>のメソッドに依存することがわかっている場合は、完全に正しいです。

6
ruakh

宣言は常に最高レベルに保つようにしてください可能つまり、必要なすべての機能を提供する最高レベルで停止する必要があります。Listメソッドが十分でない場合、LinkedList宣言はまったく問題ありません。

4
michele b

「常にインターフェースにコーディングする」というルールは、ある程度の柔軟性を持って採用する必要があります。あなたが提案していることは問題ありません、そしてあなたが結論に達したとき、唯一の選択肢です。

ちなみに、このような具象クラスへのコーディングは、ほとんどのJVMの方が高速です。パフォーマンスがルールを破る価値があるかどうかを判断するのは難しいことです。

3

Listインターフェースにないメソッドを実際に使用する必要がある場合は、LinkedListのAPIを使用しても問題はありません。リストインターフェイスへのプログラミングの一般的なルールは、1)これらのメソッドが必要になることは非常にまれであり、2)ほとんどの人の経験では、リストを並べ替えたり、ランダムに多く使用したりする必要があることに気付く可能性が高いことを認識しています。 LinkedListだけが持っているメソッドの1つが必要なのですが、アクセスして、ArrayListに切り替えることにしました。

リストが必要なものを提供していないことがわかった場合は、キューインターフェイスにプログラミングしている可能性もあります。

3
Affe

LinkedListはジェネリックです。あなたはするべきです:

LinkedList<String> linkedList = new LinkedList<String>();

(または文字列の代わりにそこに保存する必要がある他のもの)

2
Eugene Feingold

正確に100%正しいわけではありません。

コレクションを宣言するための好ましい方法は、コレクションが保持しているデータ型を含めることです。したがって、あなたの例では、それはLinkedList<Integer> ob = new LinkedList<Integer>();になります。

1
Makoto

いいえ。これは間違っています。後の段階で、リンクリストからリストタイプの他の実装に実装を変更したい場合は、うまくいきません...したがって、インターフェイスレベルの宣言を使用することをお勧めします。

1
Punith Raj

listを使用してLinkedListメソッドにアクセスすることもできます。たとえば、キャストを入力するだけです。

((LinkedList)ob).add()

LinkedListではなくジェネリックリストを使用するポイントは、使用しているリストのタイプを変更した場合(たとえば、ダブルリンクリスト)、プログラムは引き続き機能するためです。ジェネリックは、コードを単純化して、より移植性が高く、より「変更可能」にすることです。

0
John Demetriou

ジェネリックスを使用することを常にお勧めするわけではありません..... Coz時々、ここのように異なるオブジェクトをラップする必要があるかもしれません....

          String str="a string";
          boolean status=false;

          LinkedList ll = new LinkedList();
          ll.add(str);
          ll.add(status);

RMIの場合のようないくつかの状況では、uはシリアル化されたデータしか送信できません.....そしてクラスオブジェクト(シリアル化されていない)を送信したいとします.......そこでクラスのメンバーをラップできます(プリミティブ)をLinkedListに入れて、そのオブジェクト全体を渡します.......膨大な数の引数について心配する必要はありません......たとえば、次のことを考慮してください。

       public Class DataHouse
       {
             public int a;
             public String str;
             .
             .
             .
       }

今どこかであなたはオブジェクトを渡す必要があります....あなたは次のことをすることができます....

             DataHouse dh =new DataHouse();
             LinkedList ll = new LinkedList();
             ll.add(dh.a);
             ll.add(dh.str);

             // Now the content is serialized and can pass it as a capsuled data......
0
Arjun K P