Spec-Zone .ru
спецификации, руководства, описания, API
След: Наборы

Урок: Пользовательские Реализации Набора

Много программистов никогда не должны будут реализовывать свое собственное Collections классы. Можно пойти довольно далекое использование реализаций, описанных в предыдущих разделах этой главы. Однако, когда-нибудь Вы могли бы хотеть записать свою собственную реализацию. Довольно легко сделать это при помощи абстрактных реализаций, обеспеченных платформой Java. Прежде, чем мы обсудим, как записать реализацию, давайте обсуждать, почему Вы могли бы хотеть записать тот.

Причины Записать Реализацию

Следующий список иллюстрирует вид пользовательских Collections Вы мог бы хотеть реализовать. Это не предназначается, чтобы быть исчерпывающим:

Как Записать Пользовательскую Реализацию

Запись пользовательской реализации удивительно легка. Платформа Наборов 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, но это все еще не настолько трудно.

Следующий список суммирует абстрактные реализации:

Процесс записи пользовательской реализации следует:

  1. Выберите соответствующую абстрактную реализацию class из предыдущего списка.
  2. Обеспечьте реализации для всех абстрактных методов class. Если Ваш пользовательский набор должен быть поддающимся изменению, необходимо переопределить один или больше конкретных методов также. Документация API для абстрактной реализации class скажет Вам который методы переопределить.
  3. Тест и, в случае необходимости, отлаживает реализацию. У Вас теперь есть рабочая пользовательская реализация набора.
  4. Если Вы обеспокоены производительностью, считайте документацию API абстрактной реализации class для всех методов, реализации которых Вы наследовали. Если кто-либо кажется слишком медленным, переопределяет их. Если Вы переопределяете какие-либо методы, убедитесь, что определили эксплуатационные качества метода прежде и после переопределения. То, сколько усилий Вы прикладываете к тонкой настройке производительности, должно быть функцией того, сколько использования реализация доберется и насколько критический к производительности ее использование. (Часто этот шаг лучше всего опускается.)

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь
.

Предыдущая страница: Предыдущий Урок
Следующая страница: Функциональная совместимость