Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Зачем нужны абстрактные классы коллекций помимо интерфейсов?

#java #коллекции


Почему в Java, кроме интерфейсов коллекций, есть соответствующие им абстрактные классы.
Например, есть интерфейс Collection. и абстрактный класс AbstractCollection, List и
AbstractList. Почему недостаточно только интерфейса?
    


Ответы

Ответ 1



Абстрактные классы - это helper-классы, предоставляющие базовую умолчательную "скелетную" реализацию функциональности соответствующих интерфейсов. Например, класс AbstractCollection предоставляет пользователю "скелетную" реализацию интерфейса Collection. Для того, чтобы реализовать свою коллекцию, вам нужно просто унаследоваться от AbstractCollection и предоставить свои собственные реализации тех методов, которые специфичны для вашей коллекции. А те, которые неспецифичны - просто унаследуются в готовом виде из AbstractCollection. Таким образом вам не нужно будет писать ворох "скучных" методов с тривиальной или рутинной реализацией. В то же время вы не обязаны пользоваться AbstractCollection. Вы имеете полное право, если вам так захочется, реализовать интерфейс Collectionсвоими силами, с нуля, не пользуясь услугами AbstractCollection. Точно также проведено разделение между List и AbstractList.

Ответ 2



Проще скажем так: интерфейс : это характеристика класса, при чём характеристик может быть много абстрактный класс-предок : это ядро класса, зачастую стратегия поведения То есть вещи весьма разные - не удивительно, что для одного и того же класса присутствуют обе концепции.

Ответ 3



Interface - показывает, что объет класса обладает каким то поведением, но без указание того, как он это делает Abstract class - идея та же самая, но в нем, как правило, уже присутствует частичная реализация. Это позволяет избавиться от дублирования кода в классах потомках. С abstract class широко используется паттерн проектирования template method. Приведу пример из того же java.util.AbstractList. Там есть метод addAll(int index, Collection c) имеющий конкретную реализацию, в нем вызывается add(int index, E element), который в свою очередь уже является абстрактным.

Комментариев нет:

Отправить комментарий