Почему AbstractCollection не реализует size ()? - PullRequest
5 голосов
/ 13 июля 2011

Когда подклассы AbstractCollection, я все равно должен реализовать size(), хотя (я считаю) существует разумная правильная (хотя и неисполненная) реализация по умолчанию:

public int size() {
    int count = 0;

    for (Iterator<E> i = iterator(); i.hasNext();) {
        i.next();
        count++
    }

    return count;
}

Почему разработчики не включили реализацию по умолчанию size()?Они пытались заставить разработчиков сознательно задуматься об этом методе, надеясь заставить разработчика предложить реализацию, которая работает лучше, чем по умолчанию?

Ответы [ 5 ]

11 голосов
/ 13 июля 2011

Я подозреваю, что ваше последнее предложение является реальной причиной.При создании подкласса абстрактного класса иногда возникает соблазн переопределить только абстрактные методы.Я ожидал бы, что почти каждая реализация будет иметь лучшую реализацию, чем просто итерация - поэтому, если вы хотите в значительной степени всех переопределить метод, вероятно, будет хорошей идеей не предоставлять основание (медленная) реализация.Это просто уменьшает шансы испортить:)

5 голосов
/ 13 июля 2011

Хотя это возможная реализация по умолчанию, она не обязательно является хорошей (или даже нормальной).

В почти во всех универсальных Collection реализациях есть O (1) способ узнать размер. Обычно просто запрашивая простое поле.

Это должна быть реализация. В очень редких случаях, когда это не так, реализация все равно может вернуться к вашему примеру кода (или реализовать его по-другому).

1 голос
/ 13 июля 2011

Для некоторых типов списков предложенная вами реализация по умолчанию вредна.Я имею в виду ленивые списки или списки, которые приводят к очень большой структуре данных в памяти при итерации.

В случае бесконечного ленивого списка предлагаемая реализация по умолчанию явно неверна.

1 голос
/ 13 июля 2011

Я поддерживаю вашу теорию: возможно, разработчики просто вынуждены реализовать хорошую (O(1), если возможно) реализацию для size(), потому что

  • метод используется довольно часто
  • если мы программируем на интерфейсах, мы не знаем фактический тип коллекции
  • Реализация по умолчанию (или плохая) может неожиданно снизить производительность
0 голосов
/ 13 июля 2011

На самом деле, поскольку обе операции add и remove имеют возвращаемое значение, указывающее, повлекла ли операция изменение размера коллекции, вы могли бы реализовать метод size лучше, отслеживая добавляет и удаляет в большинстве случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...