如何强制子类在编译时初始化超类属性?

时间:2011-09-08 18:29:02

标签: java jsf

我有一个抽象的超类,其属性必须由子类设置才能正确操作实例...

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

这个抽象超类具有对savedSearches进行操作的方法,但是由子类来确保列表被正确初始化。

最好的方法是什么?

Java创建超类方法很容易,必须由子类实现,而不是属性。我想在超类中要求一个像这样的抽象initSavedSearch方法......

abstract initSavedSearchList();

...但这看起来很奇怪,子类实现者没有义务在他们的方法实现中做任何事情,他们可能什么都不做。

我知道我可以编写一些运行时检查来确保在运行超类中的代码之前已经保存了savedSearch列表,但是我希望编译时检查(类似于抽象方法)而不是运行时检查。

我看到一个类似问题的C#答案,建议隐藏默认(零参数)构造函数并在抽象类中创建一个构造函数,该构造函数需要将列表作为arg。对于Java来说,这听起来也不错。但我的特定类是一个JSF 1.x托管bean。我是一个JSF新手,但AFAIK没有简单的方法让JSF为Managed Beans调用非标准构造函数。

有没有办法在我得到一些编译时帮助来确保实现子类正确初始化超类属性?

谢谢!

  • 加里

1 个答案:

答案 0 :(得分:12)

其中一种方法是提供一个构造函数,将其作为参数。

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());
    }

}