Итак, я знаю, что Set
, List
и Map
являются интерфейсами, но что делает первую строку кода лучше второй?
List myArr = new ArrayList();
ArrayList myArr = new ArrayList();
Итак, я знаю, что Set
, List
и Map
являются интерфейсами, но что делает первую строку кода лучше второй?
List myArr = new ArrayList();
ArrayList myArr = new ArrayList();
Если вы используете первую форму, вы говорите, что все, что вы когда-либо собираетесь использовать, - это функциональность интерфейса List
- ничего другого, особенно ничего лишнего от какой-либо реализации. Это означает, что вы можете легко изменить используемую реализацию (например, просто заменить LinkedList
для ArrayList
в экземпляре), и не беспокоиться об этом, нарушая остальную часть кода, потому что вы могли использовать что-то конкретное для ArrayList
.
Полезный общий принцип о типах программирования (иногда называемый принцип устойчивости) выглядит следующим образом:
Список более либеральный, чем ArrayList, поскольку List может быть любым видом реализации List, например. ArrayList, LinkedList или FrancosSpecialList. Следовательно, это хорошая идея быть либеральной и принимать любой список, поскольку вы можете захотеть позже изменить его.
Основная причина использования ArrayList явно как тип (ваш второй случай) - это если вам нужно использовать методы, специфичные для ArrayList, которые недоступны через интерфейс List. В этом случае общий список не будет работать (если вы не хотите делать много уродливых и запутывающих кастингов), так что вы также можете быть явным и напрямую использовать ArrayList. У этого есть дополнительный бонус, который намекает читателю, что необходимы определенные особенности ArrayList.
Как вы можете видеть из источника ArrayList
здесь, большинство реализованных методов аннотируются как @override
, потому что все они которые определяются через интерфейс List
, поэтому, если вы собираетесь использовать только базовые функции (это то, что вы собираетесь делать большую часть времени), разница не будет практической.
Разница придет, если когда-нибудь вы подумаете, что функции ArrayList
больше не подходят для вашей проблемы, и вам понадобится что-то другое (например, LinkedList
). Если вы объявили все как List
, но были созданы как ArrayList
, вы легко переключитесь на новую реализацию, изменив экземпляры на new ArrayList()
, в то время как в другом случае вам придется также изменять все объявления переменных.
Использование List list = new ArrayList()
больше стиля ООП, поскольку вы заявляете, что вам не нужна конкретная реализация списка, и что вы хотите отказаться от статической информации о типе, поскольку вы будете полагаться на интерфейс, предоставляемый этим вид абстрагирования коллекции от ее реализации.