#java #коллекции
Почему коллекции необходимо создавать таким образом: List list = new Linkedlist(); Почему нежелательно сразу писать LinkedList?
Ответы
Ответ 1
Это важный прием написания хорошего ООП кода. Идея в том что так ваш код становится менее зависим от конкретных реализаций используемых модулей. В тот же самый интерфейс 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.Ответ 2
List — это интерфейс, а LinkedList - это класс, который имплементирует этот интерфейс. interface List содержит базовые методы add(), get(), remove() и так далее, если тебе достаточно этих методов можешь писать List<...> list = new LinkedList<..>(), если нужно использовать доп. методы которые есть в классе LinkedList тогда следует писать так LinkedList<...> linkedList = new LinkedList<...>();Ответ 3
Если ты захочешь из базы подтянуть какие-то сущности, которые в твоих репозиториях будут сохранятся как разные листы, тебе придется как минимум каждый раз чекать модель, чтобы посмотреть какой же там лист. А инициализируя через интерфейс ты на несколько секунд упрощаешь свою жизнь. Это один из примеров и таких можно навести еще много. К примеру, если ты изменил в модели лист с array на linked, но в сервисах или контроллерах подтягивал сущности именно в array, тогда тебе придется в ручную все изменять, но иницилизируя от интерфейса эта потребность отпадает.Ответ 4
Потому что это идеология джавы, объявлять переменные с типами интерфейса. Но скоро это изменится: https://habrahabr.ru/post/280188/ https://habrahabr.ru/post/280075/ val list = new Linkedlist();
Комментариев нет:
Отправить комментарий