我注意到一些奇怪的行爲。我有以下類:在構造函數中加載的Java屬性值在構造函數之後被還原?
public abstract class BaseFoo
{
public BaseFoo(String key)
{
Data data = Something.load(key);
load(data);
}
public abstract void load(Data data);
}
public class Foo extends BaseFoo
{
@Expose public long id = 0;
@Expose public String name = "";
//...
public Foo(String key)
{
super(key);
}
@Override
public void load(Data data)
{
this.id = data.id;
this.name = data.name;
//snip setting misc other fields
}
}
現在,如果我做到以下幾點:
Foo f = new Foo ("abcd");
那麼我期待f.id
包含其中裝載的Foo
記錄的ID。但是,它的價值實際上是0
。通過調試器運行此代碼,我發現在執行public long id = 0
行之前調用Foo.load()
。所以,儘管load()
被調用,它不設置id
等領域他們正確的價值觀,這些價值觀然後由public long id = 0;
和其他變量聲明覆蓋..
我從來沒有碰到過這樣的問題之前,通常值在構造函數中設置覆蓋變量聲明中的默認值。是因爲我通過super
調用了負載的值,這些值被覆蓋了嗎?如果是這樣,這是否有一個方便的解決辦法?
'long'的默認值是'0L','String'是'null'。如果你做一個簡單的檢查來返回一個空字符串而不是'null',你可以通過刪除初始值來繞過這個問題。 –
@JeroenVannevel這個班只是一個片段,我總共有10-12個字段。我不想做'if'檢查10-12次,以避免獲得nullpointerexceptions。 –
可能重複[在構造函數中可重複方法調用有什麼問題?](http://stackoverflow.com/questions/3404301/whats-wrong-with-overridable-method-calls-in-constructors) – Joe