我注意到一些奇怪的行为。我有以下类:在构造函数中加载的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