Изменение семантики методов подкласса в Java - PullRequest
1 голос
/ 27 сентября 2010

Я недавно выучил как 3 новых языка, и я начинаю путать их. Я не занимался Java в создании чего-то особенно сложного (за исключением Android) в течение пары лет. У меня проблемы с запоминанием, если это возможно:

Я делаю ArrayList на подклассы, в основном, чтобы я мог держать его в порядке. Я пытаюсь переопределить метод add(object), но я хочу, чтобы он возвращал int вместо логического (местоположение добавленного объекта). Но я получаю ошибки в типе возврата моего метода.

Возможно ли то, что я хочу, даже в языке? Можете ли вы иметь метод в подклассе, возвращающий что-то отличное от метода суперкласса?

Или я пытаюсь сделать что-то глупое? Это нарушает is-a идею наследования? Стоит ли просто инкапсулировать массив, а не расширять его?

Для справки, часть того, что я пытаюсь сделать:


public class AuthorArray extends ArrayList \{

    @Override
    public int add(Author object) {
        super.add(object);

        Collections.sort(this, new SortByLastName());

        return this.indexOf(object);
    }
}

Ответы [ 3 ]

3 голосов
/ 27 сентября 2010

Можете ли вы иметь метод в подклассе, возвращающий что-то отличное от метода суперкласса?

В общем, нет. Единственное исключение - ковариантные возвращаемые типы , когда переопределенный метод возвращает подкласс возвращаемого типа в базовом классе / методе интерфейса. Это стало возможным с Java5, и это хорошая практика. Но ваш случай не попадает в эту категорию.

Разрушает ли это идею наследства?

Да . Пользователи ArrayList ожидают получить boolean возвращаемое значение от add и будут видеть элементы в том же порядке, в котором они их добавили, и вы нарушите это ожидание. Не делай этого.

Стоит ли просто инкапсулировать массив, а не расширять его?

Да. Затем вы можете определить свой собственный интерфейс, с любым контрактом, который вы предпочитаете. Но сначала рассмотрите возможность использования TreeSet вместо .

1 голос
/ 27 сентября 2010

Изменение семантики плохо.В вашем случае изменение имени метода с add на myadd решит вашу проблему, если вы хотите простое решение.

Лично я бы порекомендовал узнать, как использовать Google guava-библиотеки неизменяемые, отсортированные структуры данных с помощью 'function', чтобы получить обзор обновлений, просмотрите YouTube.здесь, в стандартной Java, я привел пример того, как использовать автосортировку TreeSet - пользовательский класс, компаратор значений 2 и эквивалент эффективного двоичного поиска.

0 голосов
/ 27 сентября 2010

Интерфейс List гарантирует, что элементы будут возвращены в том же порядке, в котором они были добавлены.Таким образом, если у вас есть только один поток, управляющий списком, вы можете легко выполнить добавление, а затем запросить его размер.size - 1 - порядковый номер элемента.

Если приведенный выше порядок не тот, который вам нужен, у вас есть два варианта - либо отсортировать список с помощью методов Collection.sort (), либо использовать SortedSet.Оба метода могут использовать компаратор.

Я никогда не видел необходимости расширять инфраструктуру коллекций Java и не рекомендую вам делать это в таких обстоятельствах.

...