Как вы заставляете подкласс инициализировать свойство суперкласса во время компиляции? - PullRequest
5 голосов
/ 08 сентября 2011

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

abstract SuperClass {
  // this list must be initialized by the subclass
  List<? extends SavedSearch> savedSearches;
}

У этого абстрактного суперкласса есть методы, которые работают с saveSearches, но доподкласс, чтобы обеспечить правильную инициализацию списка.

Каков наилучший способ сделать это?

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

abstract initSavedSearchList();

... но, как это ни странно, разработчик подкласса не обязан ничего делать в своей реализации метода, они моглипросто ничего не делайте.

Я знаю, что могу кодировать некоторые проверки во время выполнения, чтобы убедиться, что список saveSearch инициализируется перед запуском кода в суперклассе, но я надеюсь на проверки во время компиляции (сродниабстрактные методы), а не проверки во время выполнения.

Я видел ответ C # на аналогичный вопрос, который предлагает скрыть конструктор по умолчанию (zero-arg) и создать конструктор в абстрактном классе, который требует список в качестве аргумента.Звучит неплохо и для Java.Но мой конкретный класс - это управляемый компонент JSF 1.x.Я новичок в JSF, но AFAIK нет простого способа заставить JSF вызывать нестандартный конструктор для Managed Beans.

Есть ли способ сделать это, когда я получаю некоторую помощь во время компиляции, чтобычто реализующие подклассы правильно инициализируют свойство суперкласса?

Спасибо!

  • Гари

1 Ответ

12 голосов
/ 08 сентября 2011

Одним из способов является предоставление конструктора, который принимает это в качестве аргумента.

public abstract class SuperClass {

    private List<SavedSearch> savedSearches;

    protected SuperClass(List<SavedSearch> savedSearches) {
        this.savedSearches = savedSearches;
        // You can do additional checks here on null, size(), etc.
    }

}

Подклассер необходим для вызова этого конструктора.

public class SubClass extends SuperClass {

    public SubClass() {
        super(initAndGetSavedSearchesSomehow());
    }

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