2012-03-03 4 views
4

Мне интересно, почему класс Collections был создан. Теоретически методы из этого класса могут быть помещены в класс AbstractCollection. Итак, в чем причина создания отдельного класса utils?Почему методы из Коллекций не были помещены в AbstractCollection?

+0

Возможный дубликат [Разница между сборкой Java и коллекциями] (http://stackoverflow.com/ вопросы/1796275/difference-between-java-collection-and-collections) –

+3

Не совсем дубликат. Это 'Коллекции' против' AbstractCollection'. Связанный вопрос: 'Collection' vs' Collections'. – Pursuit

ответ

3
  1. Не каждая коллекция расширяет AbstractCollection, и эти методы по-прежнему применимы.
  2. Слишком много методов в одном классе затрудняет понимание этого класса, когда вы прокладываете себе путь через Javadoc.
  3. Если вы получаете Collection от ненадежного абонента, убедитесь, что вы всегда используете ту же реализацию, например. unmodifiableCollection может быть полезным.
  4. В большинстве случаев вы не отслеживаете точный тип реализации коллекций: например, вы пишете Set<E> set = new HashSet<>();. В этом случае вы не сможете использовать какие-либо методы, определенные в AbstractCollection, которые не входят в Collection.
+0

Не могли бы вы привести пример, который класс 'Collection' не расширяет' AbstractCollection'? – mmatloka

+0

Я не уверен, что в JDK есть примеры, но сторонние проекты, такие как [Guava] (http://guava-libraries.googlecode.com), делают это все время: например, иерархия 'ImmutableCollection' и иерархия 'ForwardingCollection' не расширяет 'AbstractCollection'. –

+0

@mich, вы можете реализовать свою собственную коллекцию, которая не расширяет AbstractCollection. Это будет пример коллекции, не являющейся абстрактной коллекцией. –

2

Возможно, вам захочется реализовать независимый объект, который реализует один из интерфейсов Collection без расширения AbstractCollection.

Например: http://commons.apache.org/collections/api-release/org/apache/commons/collections/bag/HashBag.html

+0

Хорошо, будем честными: это потому, что «Сумка» намеренно нарушает контракт «Коллекция». –

0

Когда люди JDK решают, что они хотят, чтобы добавить больше методов в классе Collections они просто должны их реализовать. Например, newSetFromMap был добавлен в 1.6. Они не могут добавить больше методов в интерфейс Collection и поддерживать обратную совместимость, потому что, как сказал Луис Вассерман, не все коллекции расширяют AbstractCollection - в частности, третьи стороны, входящие в состав Guava, Commons Collections, Hibernate, OpenJPA и т. Д.

Это не так много проблем в языках, на которых есть mixins вместо интерфейсов. Скала, например, имеет огромное количество методов в своих коллекциях. Так много, на самом деле, что вы столкнулись с проблемой номер два в Луи Вассермане, которую трудно читать javadoc (в данном случае - scaladoc).

Смежные вопросы