Главная » Java » Реализация интерфейсов

0

Интерфейс описывает контракт в абстрактной форме, однако он представляет интерес лишь после того, как будет реализован в некотором классе.

Некоторые интерфейсы являются чисто абстрактными — у них нет никакого полезного универсального воплощения, и они должны заново реализовываться для каждого нового класса. Тем не менее большая часть интерфейсов может иметь несколько полезных реализаций. В случае нашего интерфейса Attributed можно придумать несколько возможных реализаций, в которых используются различные стратегии для хранения набора атрибутов.

Одна стратегия может быть простой и быстродействующей (если набор содержит малое количество атрибутов); другую можно оптимизировать для работы с наборами редко изменяемых атрибутов; наконец, третья может предназначаться для часто меняющихся атрибутов. Если бы существовал пакет с возможными реализациями интерфейса Attributed, то класс, реализующий этот интерфейс, мог бы воспользоваться  одной из них или же предоставить свой собственный вариант.

В качестве примера рассмотрим простую реализацию Attributed, в которой используется вспомогательный  класс java.util.Hashtable.  Позднее это будет использовано, чтобы реализовать интерфейс Attributed для конкретного набора объектов, наделяемых атрибутами. Прежде всего, класс AttributedImpl выглядит следующим образом:

import java.util.*;

class AttributedImpl implements Attributed

{

protected Hashtable attrTable = new Hashtable();

public void add(Attr newAttr) {

attrTable.put(newAttr.nemeOf(), newAttr);

}

public Attr find(String name) {

return (Attr)attrTable.get(name);

}

public Attr remove(String name) {

return (Attr)attrTable.remove(name);

}

public Enumeration attrs() {

return attrTable.elements();

}

}

В реализации методов AttributedImpl используется класс Hashtable.

При инициализации attrTable создается объект Hashtable, в котором хранятся атрибуты. Большая часть работы выполняется именно классом Hashtable. Класс HashTable использует метод hashCode данного объекта для хеширования. Нам не приходится писать свой метод хеширования, поскольку String уже содержит подходящую реализацию hashCode.

При добавлении нового атрибута объект Attr сохраняется в хеш-таблице, причем имя атрибута используется в качестве ключа хеширования; затем по имени атрибута можно осуществлять поиск и удаление атрибутов из хеш-таблицы.

Метод attrs возвращает значение Enumeration, в котором приведены все атрибуты, входящие в набор. Enumeration является абстрактным классом, определенным в java.util и используемым классами-коллекциями типа Hash table для возвращения списков (см. раздел “Интерфейс Enumeration”). Мы также воспользуемся этим типом, поскольку он предоставляет стандартное средство для возвращения списков в Java. Фактически интерфейс Attributed определяет тип-коллекцию, поэтому применим обычный в таких случаях механизм возврата содержимого коллекции, а именно класс Enumeration. Использование Enumeration имеет ряд преимуществ: стандартные классы-коллекции

вроде Hashtable, в которых применяется Enumeration, позволяют упростить реализацию

Attributed.

Источник: Арнольд К., Гослинг Д. – Язык программирования Java (1997)

По теме:

  • Комментарии