Видел 2 способа создать коллекцию ArrayList:
List<> название = new ArrayList<>();
ArrayList<> название = new ArrayList<>();
В чем разница и почему так можно?
Xtice
27 уровень
В чем разница?
Комментарии (8)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Anonymous #3321774
6 июля 2023, 13:16
Hello, this is Gulshan Negi
Well, in both cases, the actual object being created is an instance of ArrayList, which is one of the implementations of the List interface. The only difference in the both declaration of variable.
Thanks
0
Di Ma Java Developer в Сбер
16 февраля 2023, 14:16
ArrayList<> название = new ArrayList<>(); Вот так можно
List<> название = new ArrayList<>(); вот так нужно
Почему? потому что Принцип инверсии зависимостей
+2
Xtice Software Engineer в BigTech
16 февраля 2023, 21:31
Что такое "Принцип инверсии зависимостей"?
0
VladimirMaster
17 февраля 2023, 04:47
Это один из принципов SOLID, которые ты просто обязан знать.
+1
Джонни
16 февраля 2023, 05:02
Когда в левой части вы указыаете интерфейс (list<> в данном случае) или же родительский класс, то при создании объекта класса (который вы укажите справа ArrayList<E>() в данном случае) вы потеряете методы класса справа. Например: если запись List<> myList = new LinkedList< >();
то у myList вы не сможете вызвать метод addFirst(), который есть у линкедлист
При указании LinkedList и справа, и слева - этот метод будет у myList.
При этом если реализация вызываемого метода переписана у класса справа (и этот метод обязательно будет у класса/интерфейса слева), то вызывается реализация класса справа. Допустим у вашего класса Cat есть наследник BigCat. В Cat единственный метод sayMeow() пишет в консоль "мяу", а в классе BigCat вы переопределили этот метод, и он выводит "громкое мяу".
В таком случае коты созданные Cat myCat = new BigCat() или же BigCat myBigCat = new BigCat() оба будут выводить "громкое мяу". Однако добавите в класс BigCat метод run(), а в родителя ничего не добавите. И тогда myCat этот метод вызвать уже не сможет, а вот myBigCat без проблем.
+4
Xtice Software Engineer в BigTech
16 февраля 2023, 21:29
То есть лучше указывать тип ArrayList<> чтобы было больше возможностей?
0
Justinian Judge в Mega City One Master
17 февраля 2023, 01:36
ArrayList и специфические подтипы ты указываешь тогда, когда тебе нужны конкретные методы их.
Если тебе от коллекции нужно положить и забрать, то тебе List с головой.
Просто запомни правило, зависимость от абстракций лучше чем от конкретных реализаций, коллекции объявляем через интерфейсы, как и другие типы в большинстве случаев тоже, благодаря этому будет работать Полиморфизм, как принцип ООП.
Почему это лучше, это дает больше гибкости.
Гибкость для джава программ важна, поскольку масштабируй задачи на 1000 классов, если ты везде пишешь:
void doSomething(ArrayList<String> list) {
и в 100 классах такой метод
А потом где-то где начинается цепочка по какой-то причине тебе нужно использовать именно LinkedList<String> и что тебе нужно сделать? Правильно пойти поменять 200 классов (кроме 100 классов с кодом еще и тесты неплохо обновить было бы)
Еще раз, в одном классе по условиям задачи тебе нужно поменять
ArrayList<String> data = retrieveData()
на
LinkedList<String> data = retrieveData , простое изменение
но тебе нужно будет 200 классов менять других, не имеющих отношения к твоему заданию.
Только из -за того что ты указал конкретную имплемантацию - ArayList, то есть гвоздями прибил жестко привязал все эти 200 классов к одному конкретному типу
В то же время, если бы там было List<String> указано, этих бы изменений не понадобилось бы. Поскольку зависимость была бы на абстракциях - интерфейсе, а не на конкретной имплементации.
Поэтому дополнительные возможности - да, есть такое, но это используется только когда ты четко знаешь что тебе нужно специфический метод использовать, который родительский класс или интерфейс не дает использовать, а это бывает на порядки реже.
Представь джава программу как ЖД состав, где привязка к имплементациям (arrayList или LinkedList) это как намертво приваренные балки между вагонами, а привязка на интерфейсах это такие пружины гибкие которые разрешат вагонам и составу поворачивать и входит в поворот
+21
Xtice Software Engineer в BigTech
17 февраля 2023, 06:17
Большое спасибо за такой конкретный ответ!
+1