Операция RandomAccess в AbstractList.java

В java-документе класса RandomAccess написано, что «Маркерный интерфейс, используемый реализациями List, чтобы указать, что они поддерживают быстрый (обычно постоянный )произвольный доступ по времени. Основная цель этого интерфейса — позволить универсальным алгоритмам изменять свое поведение, чтобы обеспечить хорошую производительность при применении либо к случайным, либо списки последовательного доступа».

но я нашел кое-что странное

это метод subList в AbstractList.java в пакете java.util

public List<E> subList(int fromIndex, int toIndex) {
    return (this instanceof RandomAccess ?
            new RandomAccessSubList<>(this, fromIndex, toIndex) :
            new SubList<>(this, fromIndex, toIndex));
}

Реализация класса RandomAccessSubList:

class RandomAccessSubList<E> extends SubList<E> implements RandomAccess {
    RandomAccessSubList(AbstractList<E> list, int fromIndex, int toIndex) {
        super(list, fromIndex, toIndex);
    }

    public List<E> subList(int fromIndex, int toIndex) {
        return new RandomAccessSubList<>(this, fromIndex, toIndex);
    }
}

Реализация класса SubList:

SubList(AbstractList<E> list, int fromIndex, int toIndex) {
    if (fromIndex < 0)
        throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
    if (toIndex > list.size())
        throw new IndexOutOfBoundsException("toIndex = " + toIndex);
    if (fromIndex > toIndex)
        throw new IllegalArgumentException("fromIndex(" + fromIndex +
                                           ") > toIndex(" + toIndex + ")");
    l = list;
    offset = fromIndex;
    size = toIndex - fromIndex;
    this.modCount = l.modCount;
}

и я думаю, что в классе AbstractList RandomAccessSubList бесполезен, потому что он передает свои данные в класс SubList, и его работа похожа на

new SubList<>(this, fromIndex, toIndex)); 

в методе подсписка

5
задан Pooya 12 July 2012 в 10:19
поделиться