Путаница по поводу объявления объекта - PullRequest
0 голосов
/ 13 ноября 2011

Я изучаю Коллекции в книге CoreJava, и я нашел этот код:

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

Теперь мне интересно, почему этот код не такой:

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

Почему мы объявляем a списком?

Ответы [ 5 ]

4 голосов
/ 13 ноября 2011

Ваш второй будет работать и может быть предпочтительнее, если вам нужно использовать операции, специфичные для LinkedList. Но эта необходимость, как правило, довольно редко. Первый является более общим - он позволяет вам использовать другую реализацию List, изменяя только одну строку. Другой код (например, параметры метода) менять не нужно.

P.S. Просто чтобы быть ясным - LinkedList - это конкретная реализация List.

4 голосов
/ 13 ноября 2011

Список - это интерфейс, LinkedList - это конкретная реализация интерфейса. «Запрограммируйте на« интерфейс », а не на« реализацию »: http://en.wikipedia.org/wiki/Design_Patterns#Introduction.2C_Chapter_1

3 голосов
/ 13 ноября 2011

Код:

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

лучше, чем:

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

Это потому, что если вы объявили list как List и обнаружили, что производительность программыэто не хорошо, вы можете изменить код на:

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

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

В качестве заключения, если возможно, объявите ссылку как интерфейс (List - это интерфейс):

List<String> list;

и вы можете легко переключать реализация (class ArrayList и class LinkedList являются реализациями интерфейса List):

list = new LinkedList<String>();

или

list = new ArrayList<String>();
1 голос
/ 13 ноября 2011

еще один хороший пример.

Почему мы объявляем список?

Рассмотрим метод:

public void doStuff(LinkedList llObj){} 

Это показывает ограничение на метод, который пользователи разрешают только передавать LinkedList.

public void doStuff(List listObj) {} 

в то время как этот метод позволяет передавать любой список.

надеюсь, это поможет.

0 голосов
/ 27 января 2015

В Java, как и во всех других языках ООП, одним из основных преимуществ проектирования является Полиморфизм. Полиморфизм просто не включает методы, но распространяется и на классы и принимает имена, такие как подтип, политипизм и т. Д.

В вашем первом примере кода:

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

Заставляет тип ссылочной переменной 'a' принимать любые конкретные расширения типа 'List'.

Где, как в следующем примере кода:

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

Ссылочная переменная 'a' может принимать любые расширения типа 'LinkedList'.

Чтобы понять силу этого, мы должны проверить иерархию типов LinkedList: http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html

Таким образом, в вашем первом примере вы увеличиваете область ссылки «a» на любой конкретный тип «List», который также включает LinkedList, где, как и во втором примере, вы уменьшаете свою область действия до типа «LikedList» и его подтипов. .

Один не лучше другого, но многое зависит от вашего дизайна кода и приложения в отношении того, какой подход лучше всего подходит для вашего варианта использования.

Некоторые хорошие чтения:

Полиморфизм подтипов: http://en.wikipedia.org/wiki/Polymorphism_(computer_science)#Subtyping

...