我有一个抽象的超类,其属性必须由子类设置才能正确运行实例...
abstract SuperClass {
// this list must be initialized by the subclass
List<? extends SavedSearch> savedSearches;
}
Run Code Online (Sandbox Code Playgroud)
此抽象超类具有对savedSearches进行操作的方法,但由子类决定是否正确初始化列表.
最好的方法是什么?
使用Java创建超类方法很容易,这些方法必须由子类实现,而不是属性.我想在超类中需要一个像这样的抽象initSavedSearch方法......
abstract initSavedSearchList();
Run Code Online (Sandbox Code Playgroud)
......但这看起来很奇怪,子类实现者没有义务在他们的方法实现中做任何事情,他们可能什么都不做.
我知道我可以编写一些运行时检查来确保在超类中运行代码之前已经保存了savedSearch列表,但是我希望编译时检查(类似于抽象方法)而不是运行时检查.
我看到一个类似问题的C#答案,建议隐藏默认(零参数)构造函数并在抽象类中创建一个构造函数,该构造函数需要将列表作为arg.对于Java来说,这听起来也不错.但我的特定类是一个JSF 1.x托管bean.我是一个JSF新手,但AFAIK没有简单的方法让JSF为Managed Beans调用非标准构造函数.
有没有办法做到这一点,我得到一些编译时帮助,以确保实现子类正确初始化超类属性?
谢谢!
Bal*_*usC 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.
}
}
Run Code Online (Sandbox Code Playgroud)
子类请求者需要调用该构造函数.
public class SubClass extends SuperClass {
public SubClass() {
super(initAndGetSavedSearchesSomehow());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2539 次 |
| 最近记录: |