Объявление LinkedList в Java - PullRequest
10 голосов
/ 23 марта 2012

Я всегда узнаю, когда мы объявляем коллекцию, которую мы должны сделать, Interface ob = new Class(), если я хочу использовать, например, LinkedList, я сделаю List ob = new LinkedList(), но тогда у меня не будет доступа ко всем методам из LinkedList.Не правильно ли LinkedList ob = new LinkedList() 100%?

Ответы [ 11 ]

11 голосов
/ 23 марта 2012

Не является ли LinkedList ob = новым LinkedList () на 100% правильным?

Хорошо, я бы предложил использовать универсальную форму, но уверен - если вы хотите использовать функциональность, которая является специфической до LinkedList, вам необходимо объявить переменную соответственно.

Возможно, вы захотите проверить, имеют ли интерфейсы Deque<E> или Queue<E> то, что вы хотите. Если они это сделают, используйте их в соответствии с идеей описания того, что вам нужно, а не того, какую реализацию вы будете использовать.

6 голосов
/ 23 марта 2012

Да,

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

совершенно правильно, если вы знаете, что items будет зависеть от методов LinkedList<T>, которые не фиксируются в интерфейсе List<T>.

4 голосов
/ 23 марта 2012

Вы всегда должны стараться поддерживать декларацию на самом высоком уровне возможно , что означает, что вам следует остановиться на самом высоком уровне, который обеспечивает всю необходимую функциональность: если методов List недостаточно, у вас все в порядке с вашей декларацией LinkedList.

3 голосов
/ 23 марта 2012

Если вам действительно нужно использовать методы, отсутствующие в интерфейсе List, то, безусловно, в использовании LinkedList API нет ничего плохого. Общее правило программирования для интерфейса List признает, что 1) эти методы довольно редки, и 2) по опыту большинства людей, более вероятно, что я обнаружу, что мне нужно отсортировать список и / или использовать много случайных доступа и решите переключиться на ArrayList, чем мне нужен один из методов, которые есть только в LinkedList.

Может также случиться так, что вы можете программировать для интерфейса очереди, если обнаружите, что List не дает вам то, что вам нужно.

3 голосов
/ 23 марта 2012

Правило «всегда кодировать интерфейсам» должно приниматься с некоторой гибкостью.то, что вы предлагаете, хорошо, и, как вы пришли к выводу, единственный вариант.

В качестве дополнительного примечания, кодирование в конкретные классы, подобные этому, быстрее большинства JVM.Решить, стоит ли производительность нарушать правило, трудно.

2 голосов
/ 23 марта 2012

LinkedList является универсальным.Вы должны делать:

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

(или все, что вам нужно хранить там вместо String)

1 голос
/ 20 апреля 2012

Нет .. Это было бы неправильно, на более поздних этапах, если он хочет изменить свою реализацию со связанного списка на любую другую реализацию типа списка, он пойдет не так ... Так что лучше использовать объявление уровня интерфейса.

1 голос
/ 23 марта 2012

Не совсем на 100% правильно.

Предпочтительный способ объявить любую коллекцию - включить тип данных, который она содержит. Итак, для вашего примера это будет LinkedList<Integer> ob = new LinkedList<Integer>();.

0 голосов
/ 06 ноября 2012

вы все равно можете иметь доступ к методам LinkedList с помощью List, все, что вам нужно сделать, это набрать приведение, например,

((LinkedList)ob).add()

Смысл использования универсального List, а не LinkedList, заключается в том, что в случаеизмените тип используемых вами списков (скажем, двойной связанный список), ваша программа будет по-прежнему работать. Общие принципы - упростить ваш код, сделать его более переносимым и более «изменяемым»

0 голосов
/ 23 июня 2012

Я не всегда буду предлагать вам использовать дженерики ..... Потому что иногда вам может понадобиться обернуть разные объекты, как здесь ....

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

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

В некоторых ситуациях, таких как RMI, вы можете отправлять только сериализованные данные ..... и предположить, что вы хотите отправить объект класса (который не сериализован) ....... Там вы можете обернуть членов класс (примитивы) в 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......
...