Почему коллекции необходимо создавать таким образом:
List list = new Linkedlist();
Почему нежелательно сразу писать LinkedList?
Почему коллекции необходимо создавать таким образом:
List list = new Linkedlist();
Почему нежелательно сразу писать LinkedList?
Это важный прием написания хорошего ООП кода. Идея в том что так ваш код становится менее зависим от конкретных реализаций используемых модулей. В тот же самый интерфейс List можно записать LinkedList, ArrayList, CopyOnWriteArrayList и т.д.
При этом, объявив список подобным образом, мы можем быть уверены что если вдруг появится необходимость подменить реализацию с LinkedList на ArrayList, то нам придется изменить только строчку с вызовом конструктора. Например LinkedList, в отличии от ArrayList, помимо интерфейса List имплементирует ещё Queue(очередь) в котором есть метод push.
List list = new LinkedList();
LinkedList linkedList = new LinkedList();
ArrayList arrayList = new ArrayList();
list.add("ok");
linkedList.add("ok");
arrayList.add("ok");
list.push("error"); //ошибка при компиляции, у интерфейса List нет такого метода.
linkedList.push("Ok");
arrayList.push("error"); //ошибка при компиляции, ArrayList не имплементирует Queue
В примере выше, даже не смотря на то что в list у нас хранится экземпляр LinkedList, мы не можем вызвать специфичные для него методы. Интерфейс List вынуждает нас пользоваться только методами списка, а не очереди или чего-либо ещё.
Использование интерфейса вместо реализации не столь важно когда коллекция(или другой объект) создаётся и используется внутри одного метода, но важно если она каким-либо образом передаётся в другие модули.
Подробнее на эту тему читайте про SOLID.
List — это интерфейс, а LinkedList - это класс, который имплементирует этот интерфейс. interface List содержит базовые методы add(), get(), remove() и так далее, если тебе достаточно этих методов можешь писать List<...> list = new LinkedList<..>(), если нужно использовать доп. методы которые есть в классе LinkedList тогда следует писать так LinkedList<...> linkedList = new LinkedList<...>();
List list = new Linkedlist(); а не Linkedlist list = new Linkedlist();
– Алексей Шиманский
Apr 14 '16 at 18:40
List - это интерфейс, насколько я помню. LinkedList - класс, реализующий этот интерфейс. LinkedList не может быть интерфейсом, поскольку new Linkedlist() создаёт экземпляр, а экземпляр интерфейса создать нельзя. Поэтому утверждение "LinkedList это интерфейс List" неверно.
– Qwertiy
Apr 14 '16 at 18:44
Если ты захочешь из базы подтянуть какие-то сущности, которые в твоих репозиториях будут сохранятся как разные листы, тебе придется как минимум каждый раз чекать модель, чтобы посмотреть какой же там лист. А инициализируя через интерфейс ты на несколько секунд упрощаешь свою жизнь. Это один из примеров и таких можно навести еще много. К примеру, если ты изменил в модели лист с array на linked, но в сервисах или контроллерах подтягивал сущности именно в array, тогда тебе придется в ручную все изменять, но иницилизируя от интерфейса эта потребность отпадает.
Потому что это идеология джавы, объявлять переменные с типами интерфейса.
Но скоро это изменится:
https://habrahabr.ru/post/280188/
https://habrahabr.ru/post/280075/
val list = new Linkedlist();
List, то и переменную надо объявлять как List - так близко к базовому типу как это возможно.
–
Apr 14 '16 at 19:02