我知道這是一個壞主意,它會導致錯誤。問題是,我需要「有意」的行爲。從構造函數調用抽象方法的安全替代
「低」:
// 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',所以這首先是無意義的。你會設置一個等於它自己的變量。 –