|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Много программистов никогда не должны будут реализовывать свое собственное Collections классы. Можно пойти довольно далекое использование реализаций, описанных в предыдущих разделах этой главы. Однако, когда-нибудь Вы могли бы хотеть записать свою собственную реализацию. Довольно легко сделать это при помощи абстрактных реализаций, обеспеченных платформой Java. Прежде, чем мы обсудим, как записать реализацию, давайте обсуждать, почему Вы могли бы хотеть записать тот.
Следующий список иллюстрирует вид пользовательских Collections Вы мог бы хотеть реализовать. Это не предназначается, чтобы быть исчерпывающим:
Collection реализации находятся в оперативной памяти и исчезают, когда программа выходит. Если Вы хотите набор, который будет все еще присутствовать в следующий раз, когда программа запускается, можно реализовать ее, создавая фанеру по внешней базе данных. Такой набор мог бы быть одновременно доступным многократными программами.Map содержа телеметрические данные в реальном времени. Ключи могли представить расположения, и значения могли быть считаны из датчиков в этих расположениях в ответ на get работа.List содержа долгие выполнения идентичных значений элемента. Такие списки, которые часто происходят в обработке текста, могут быть длиной до выполнения закодированный — выполнения могут быть представлены как единственный объект, содержащий повторный элемент и число последовательных повторений. Этот пример интересен, потому что он балансирует между двумя аспектами производительности: требуется меньше пространства, но больше времени чем ArrayList.Collection это предлагает постоянно-разовые проверки включения, позволяя двойные элементы. Это разумно прямо, чтобы реализовать такой набор на a HashMap.List экземпляры, представляющие непрерывный диапазон Integers.Запись пользовательской реализации удивительно легка. Платформа Наборов 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, но это все еще не настолько трудно.
Следующий список суммирует абстрактные реализации:
Collection это ни один не a Set ни a List. Как минимум следует обеспечить iterator и size методы.Set; использование идентично AbstractCollection.List поддержанный хранилищем данных произвольного доступа, таким как массив. Как минимум следует обеспечить positional access методы (get и, дополнительно, set, remove, и add) и size метод. Абстрактный class заботится о listIterator (и iterator).List поддержанный с последовательным доступом хранилищем данных, таким как связанный список. Как минимум следует обеспечить listIterator и size методы. Абстрактный class заботится о позиционных методах доступа. (Это - противоположность AbstractList.)offer, peek, poll, и size методы и iterator поддержка remove.Map. Как минимум следует обеспечить entrySet представление. Это обычно реализуется с AbstractSet class. Если Map является поддающимся изменению, следует также обеспечить put метод.Процесс записи пользовательской реализации следует: