Подтвердить что ты не робот

Список по сравнению с ArrayList в качестве ссылочного типа?

Итак, я знаю, что Set, List и Map являются интерфейсами, но что делает первую строку кода лучше второй?

List myArr = new ArrayList();
ArrayList myArr = new ArrayList();
4b9b3361

Ответ 1

Если вы используете первую форму, вы говорите, что все, что вы когда-либо собираетесь использовать, - это функциональность интерфейса List - ничего другого, особенно ничего лишнего от какой-либо реализации. Это означает, что вы можете легко изменить используемую реализацию (например, просто заменить LinkedList для ArrayList в экземпляре), и не беспокоиться об этом, нарушая остальную часть кода, потому что вы могли использовать что-то конкретное для ArrayList.

Ответ 2

Полезный общий принцип о типах программирования (иногда называемый принцип устойчивости) выглядит следующим образом:

  • Будьте либералы относительно того, что вы принимаете.
  • Будьте осторожны в том, что вы испускаете.

Список более либеральный, чем ArrayList, поскольку List может быть любым видом реализации List, например. ArrayList, LinkedList или FrancosSpecialList. Следовательно, это хорошая идея быть либеральной и принимать любой список, поскольку вы можете захотеть позже изменить его.

Основная причина использования ArrayList явно как тип (ваш второй случай) - это если вам нужно использовать методы, специфичные для ArrayList, которые недоступны через интерфейс List. В этом случае общий список не будет работать (если вы не хотите делать много уродливых и запутывающих кастингов), так что вы также можете быть явным и напрямую использовать ArrayList. У этого есть дополнительный бонус, который намекает читателю, что необходимы определенные особенности ArrayList.

Ответ 3

Как вы можете видеть из источника ArrayList здесь, большинство реализованных методов аннотируются как @override, потому что все они которые определяются через интерфейс List, поэтому, если вы собираетесь использовать только базовые функции (это то, что вы собираетесь делать большую часть времени), разница не будет практической.

Разница придет, если когда-нибудь вы подумаете, что функции ArrayList больше не подходят для вашей проблемы, и вам понадобится что-то другое (например, LinkedList). Если вы объявили все как List, но были созданы как ArrayList, вы легко переключитесь на новую реализацию, изменив экземпляры на new ArrayList(), в то время как в другом случае вам придется также изменять все объявления переменных.

Использование List list = new ArrayList() больше стиля ООП, поскольку вы заявляете, что вам не нужна конкретная реализация списка, и что вы хотите отказаться от статической информации о типе, поскольку вы будете полагаться на интерфейс, предоставляемый этим вид абстрагирования коллекции от ее реализации.