WedX - журнал о программировании и компьютерных науках

Путаница с объявлением объекта

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

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

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

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

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



Ответы:


1

Код:

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>();

or

list = new ArrayList<String>();
13.11.2011

2

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

12.11.2011

3

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

P.S. Просто для ясности: LinkedList — это конкретная реализация List.

12.11.2011

4

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

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

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

public void doStuff(LinkedList llObj){} 

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

public void doStuff(List listObj) {} 

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

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

13.11.2011

5

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

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

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

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

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

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

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

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

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

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

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

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

27.01.2015
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]