我知道这是一个坏主意,它会导致错误。问题是,我需要“有意”的行为。从构造函数调用抽象方法的安全替代
“低”:
// simplified example
abstract class Low {
String name;
public Low(String name) {
this.name = name;
}
public Low(int id) {
this.name = getNameForId(id);
}
public Low() {} // will be loaded later
@Override
public String toString()
{
return name;
}
public void load(InputStream in) {
// --- grab ID from stream ---
this.name = getNameForId(id);
}
protected abstract String getNameForId(int id);
}
和 “高”:
class High extends Low {
public High(int id) { super(id); }
public High(String name) { super(name); }
public High() {} // will be loaded later
@Override
protected String getNameForId(int id)
{
return Registry.getName(id);
}
}
注意,在这种特殊情况下,它会工作得很好。但是一旦压倒一切的方法需要使用某个领域,它就会崩溃。
如何更好地做到这一点?
你能否举一个事例分崩离析的例子?我不确定我是否遵守。 –
如果类High返回getName()中的this.myNameField,它将不会被初始化并返回null。 – MightyPork
是的,但Low构造函数会说'this.name = getName()',getName()会返回'this.name',所以这首先是无意义的。你会设置一个等于它自己的变量。 –