Использование методов суперкласса «protected final» для хранения общего кода для подклассов - PullRequest
9 голосов
/ 04 октября 2011

Как начинающему программисту на Java, я хотел бы знать, стоит ли переносить общий блок кода, который используют все подклассы, в отдельный защищенный ( окончательный ) метод в родительском классе? Такие задачи, как заполнение списков общими значениями или общие алгоритмы фильтрации и т. Д. Хорошо ли также использовать защищенные статические методы?

class A {
    protected final List<String> getVariants() {...}
    protected final List<String> filterResults(List<String> variants) {...}
}

class B extends A {
    public List<String> doSomethingUsefull() {
        List<String> commonVariants = getVariants();
        ...
        return filterResults(commonVariants);
    }
}

class C extends A {
    public void doSomethingUsefull() {
        List<String> commonVariants = getVariants();
        ...
        return filterResults(commonVariants);
    }

    public void doMoreUsefullThings() {
        List<String> commonVariants = getVariants();
        ...
        return filterResults(commonVariants);
    }
}

Ответы [ 4 ]

21 голосов
/ 04 октября 2011

Если вы новичок в Java и думаете о таких вещах, то сейчас самое время прочитать главу 4 «Классы и интерфейсы» в книге под названием «Эффективная Java». Информация там будет более подробной и детальной, чем ответы, которые вы получите здесь.

Вот один способ подумать о смешивании ключевых слов final, protected и static:

  • ОО-пуристы посоветуют вам избегать static, потому что это нарушает парадигму ОО.
  • Конечно, использование ключевого слова final не позволяет подклассам также переопределять метод. В этом отношении результат такой же, как с static.
  • final следует использовать чаще, и рекомендуется использовать его вместе с protected. См. Пункт 17 «Эффективная Java».
  • protected и static не очень часто используются вместе. Вы бы смешали ОО-конструкцию с конструкцией, которая нарушает нормальное ОО-поведение, поэтому комбинация нечетна.
4 голосов
/ 04 октября 2011

Мне кажется разумным - хотя вы также можете сделать A абстрактным. Также рассмотрите возможность использования композиции вместо - могут ли B и C содержать и A вместо ее подкласса?

2 голосов
/ 04 октября 2011

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

Во-вторых, вы совершенно правы, что вы не повторяете свой код, а группируете его по повторнымчасть кода не является хорошим выбором.Предпочтительным способом является группировка вещей, имеющих смысл в реальном мире, по уровню абстракции.

И последнее, но не менее важное: если у вас есть сомнения: отдельно или нет, расширение или компоновка, защищенный финал или только защищенный, попробуйте написать модульный тест для этого класса, и ответы придут очень быстро.

0 голосов
/ 04 октября 2011

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

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