Писать List<Something> myList = new ArrayList<Something>();
, вероятно, чаще, чем использовать Collection
.Обычно некоторые аспекты того, чтобы быть списком, важны.Неопределенность Collection
в отношении принятия дублированных элементов, будь то набор или список (или что-то еще) под ними, может быть болезненной.
С другой стороны, основная цель - абстракция или независимость реализации.Меня действительно волнует, является ли список, который у меня есть, ArrayList
или Vector
?Вероятно, не большую часть времени.Мой код будет более гибким, если он использует самый общий интерфейс, который выражает то, что мне нужно для объекта.
Простой пример: предположим, что вы пишете программу, используя все ArrayList
s, а затем она требуетдля поддержки нескольких пользователей, поэтому для обеспечения безопасности потоков вы хотите изменить все свои ArrayList
s на Vecto
rs.Если вы раздавали ссылки на Тип ArrayList
, вам придется везде менять каждое использование.Если вы передаете ссылки на тип List
, вам нужно только изменить места, где вы их создаете.
Кроме того, иногда реализующий класс может быть не тем, что вы можете или хотите импортировать ииспользовать.Например, при использовании поставщика постоянства, такого как hibernate, реальный класс, который реализует интерфейс Set
, может быть узкоспециализированной пользовательской реализацией, уникальной для платформы, или это может быть просто старый HashSet
, в зависимости от того, как был создан объект.Вы не заботитесь о разнице, это просто Set
для вас.