【发布时间】:2012-06-30 22:48:33
【问题描述】:
我有一对看起来像这样的类;
public abstract class Class1 {
//...
public Class1() {
//...
function2();
//...
}
protected abstract void function2();
}
public class Class2 implements Class1 {
private final OnSomethingListener mOnSomethingListener = new OnSomethingListener() {
@Override
onSomething() {
doThatOtherThing();
}
}
protected void function2() {
//uses mOnSomethingListener
//however mOnSomethingListener is null when this function is called from super()
//...
}
public Class2() {
super();
}
}
我假设侦听器为空,因为我有效地从super() 引用它并且它尚未实例化。但是,我想将其设为final,因为它确实如此。我可以让这个字段(监听器)及时初始化而不把它放在超类中(永远不会使用监听器)吗?
【问题讨论】:
-
拥有正确的行为应该胜过“尽可能使用
final”。我只是为延迟初始化该字段的侦听器使用吸气剂。这使得初始化的顺序非常清晰和明确,而不依赖于技术性。或者,您可以在构造函数之后运行第二个初始化函数并调用function2(),但我仍然认为这不是比删除final更好的选择。 -
超类将在其子类之一之前被初始化。
-
@Jean-ChristopheFortin:如果超类需要子类直接管理的对象,这是一个很好的解决方案。在这种情况下,OP 似乎希望超类不知道
function2()究竟做了什么或需要运行什么。
标签: java null super construction