Список по сравнению с ArrayList в качестве ссылочного типа? - PullRequest
20 голосов
/ 31 октября 2010

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

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

Ответы [ 3 ]

33 голосов
/ 31 октября 2010

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

11 голосов
/ 31 октября 2010

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

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

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

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

6 голосов
/ 31 октября 2010

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

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

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

...