以下设置:
public class Superclass
{
private String params;
public Superclass(String params)
{
this.params = params;
doStuff();
}
public void doStuff()
{
// uninteresting stuff
}
}
public class Subclass extends Superclass
{
private Object someObject;
public Subclass(String params, Object someObject)
{
super(params);
this.someObject = someObject;
}
@Override
public void doStuff()
{
someObject.toString(); // <- causes NullPointerException
}
}
Superclass创建用户界面,而Subclass应创建更专业的版本。
从软件工程的角度来看,阻止NullPointerException
而“子类”的最简洁方法仍然是“超类”?
答案 0 :(得分:2)
父类在施工时有 no 明显的理由来调用doStuff
。
简单地说,不要把电话放在那里。这些类应该彼此独立地构建。父类不应依赖子进程中的任何数据来完成其构造;在父构造函数中调用的子窗口重写的任何方法都将引入此依赖关系。
如果你做发现你需要在父母中调用一个额外的方法,你可以制作一个final
方法,不会发生任何不良影响,因为孩子不会&#39 ; t可以访问该方法。
public class Superclass {
private String params;
public Superclass(String params) {
this.params = params;
doStuffParent();
}
public final void doStuffParent() {
// uninteresting stuff
}
public void doStuff() {
// uninteresting stuff...again?
}
}
答案 1 :(得分:0)
从软件工程的角度来看,您正在尝试对尚未构造的对象执行操作。将这个想法映射到你的真正的类和它的工作,你会明白超类构造函数存在一些问题,因为它试图处理处于错误状态的对象。
话虽如此,你有几个选择。
Object someObject
传递给超类。可能超级班真的需要它来工作。doStuff()
。在两个构造函数之外明确地调用它甚至是有意义的。doStuff(..)
。