Spec-Zone .ru
спецификации, руководства, описания, API
|
Много программистов никогда не должны будут реализовывать свое собственное Collection
s классы. Можно пойти довольно далекое использование реализаций, описанных в предыдущих разделах этой главы. Однако, когда-нибудь Вы могли бы хотеть записать свою собственную реализацию. Довольно легко сделать это при помощи абстрактных реализаций, обеспеченных платформой Java. Прежде, чем мы обсудим, как записать реализацию, давайте обсуждать, почему Вы могли бы хотеть записать тот.
Следующий список иллюстрирует вид пользовательских Collection
s Вы мог бы хотеть реализовать. Это не предназначается, чтобы быть исчерпывающим:
Collection
реализации находятся в оперативной памяти и исчезают, когда программа выходит. Если Вы хотите набор, который будет все еще присутствовать в следующий раз, когда программа запускается, можно реализовать ее, создавая фанеру по внешней базе данных. Такой набор мог бы быть одновременно доступным многократными программами.Map
содержа телеметрические данные в реальном времени. Ключи могли представить расположения, и значения могли быть считаны из датчиков в этих расположениях в ответ на get
работа.List
содержа долгие выполнения идентичных значений элемента. Такие списки, которые часто происходят в обработке текста, могут быть длиной до выполнения закодированный — выполнения могут быть представлены как единственный объект, содержащий повторный элемент и число последовательных повторений. Этот пример интересен, потому что он балансирует между двумя аспектами производительности: требуется меньше пространства, но больше времени чем ArrayList
.Collection
это предлагает постоянно-разовые проверки включения, позволяя двойные элементы. Это разумно прямо, чтобы реализовать такой набор на a HashMap
.List
экземпляры, представляющие непрерывный диапазон Integer
s.Запись пользовательской реализации удивительно легка. Платформа Наборов Java обеспечивает абстрактные реализации, разработанные явно, чтобы облегчить пользовательские реализации. Мы запустим со следующего примера реализации Arrays.asList
.
public static <T> List<T> asList(T[] a) { return new MyArrayList<T>(a); } private static class MyArrayList<T> extends AbstractList<T> { private final T[] a; MyArrayList(T[] array) { a = array; } public T get(int index) { return a[index]; } public T set(int index, T element) { T oldValue = a[index]; a[index] = element; return oldValue; } public int size() { return a.length; } }
Верьте этому или нет, это очень близко к реализации, которая содержится в java.util.Arrays
. Это - это простое! Вы предоставляете конструктору и get
, set
, и size
методы, и AbstractList
делает все остальные. Вы добираетесь ListIterator
, объемные операции, операции поиска, вычисление хэш-кода, сравнение, и строковое представление бесплатно.
Предположите, что Вы хотите сделать реализацию немного быстрее. Документация API для абстрактных реализаций описывает точно, как каждый метод реализуется, таким образом, Вы будете знать, какие методы переопределить, чтобы получить производительность Вы хотите. Производительность предыдущей реализации прекрасна, но она может быть улучшена немного. В частности toArray
метод выполняет итерации по List
, копирование одного элемента за один раз. Учитывая внутреннее представление, это намного быстрее и более разумно только клонировать массив.
public Object[] toArray() { return (Object[]) a.clone(); }
С добавлением этого переопределения и еще много любят это, эта реализация является точно той, найденной в java.util.Arrays
. В интересах полного раскрытия немного более трудно использовать другие абстрактные реализации, потому что необходимо записать свой собственный iterator, но это все еще не настолько трудно.
Следующий список суммирует абстрактные реализации:
AbstractCollection
Collection
это ни один не a Set
ни a List
. Как минимум следует обеспечить iterator
и size
методы.AbstractSet
Set
; использование идентично AbstractCollection
.AbstractList
List
поддержанный хранилищем данных произвольного доступа, таким как массив. Как минимум следует обеспечить positional access
методы (get
и, дополнительно, set
, remove
, и add
) и size
метод. Абстрактный class заботится о listIterator
(и iterator
).AbstractSequentialList
List
поддержанный с последовательным доступом хранилищем данных, таким как связанный список. Как минимум следует обеспечить listIterator
и size
методы. Абстрактный class заботится о позиционных методах доступа. (Это - противоположность AbstractList
.)AbstractQueue
offer
, peek
, poll
, и size
методы и iterator
поддержка remove
.AbstractMap
Map
. Как минимум следует обеспечить entrySet
представление. Это обычно реализуется с AbstractSet
class. Если Map
является поддающимся изменению, следует также обеспечить put
метод.Процесс записи пользовательской реализации следует: