我序列化调用setter /反序列化以下类:的Java:何时/如何从构造和GSON解串器
public class Branch {
private Conditional condition;
private transient StringProperty conditionText = new SimpleStringProperty();
public Branch()
{
}
public Branch(Conditional condition) {
this();
setCondition(condition);
}
public void setCondition(Conditional condition) {
this.condition = condition;
if (this.condition != null) {
conditionText.set(this.condition.toString());
} else {
conditionText.set("");
}
}
}
Conditional
是我写的类。 Branch
还有其他的属性和方法,为了清楚我省略了它们。
conditionText
的目的只是为了在GUI需要时提供condition.toString()
的结果(这就是为什么它是StringProperty
)。 conditionText
的值在设置者condition
中更新。所以理论上每次condition
更改,conditionText
都适当更新。
请注意,构造函数也调用setCondition()
,以便在构造Branch
时设置conditionText
。 [旁边的问题:我听说从构造函数调用setter是不好的习惯,但在这种情况下没有意义吗? ]
当我使用默认的GSON反序列化器对Branch
进行反序列化时,一切都按预期进行。然而,我遇到的问题是condition
的设置器显然在反序列化过程中从未被调用,所以conditionText
的值从未设置。
有没有一种方法可以解决这个问题,或者更好的方法,即使在更新condition
时也会更新conditionText
,即使在GSON反序列化期间也是如此?
我可以想像一对夫妇可能的方法,但我也不清楚是最好的:
- 让
Condition
一个Observable
类,并添加一个ChangeListener
到condition
,更新conditionText
- 编写自定义
Branch
的解串器,它只调用Branch
的每个属性的默认解串器,然后调用构造函数Branch
感谢您的建议!
如果你调用setCondition,永远(不仅仅是来自构造函数),你应该总是得到一个空指针异常,因为什么都没有初始化contictionText变量,这意味着它是空的。 – DwB
是的,我忘了将调用包含到'SimpleStringProperty'构造函数中。这已经在我原来的源代码中,所以这不是我的问题的原因。我现在也在这里添加了构造函数调用。 – skrilmps
据我所知,从构造函数调用setter的唯一问题是你的setter被覆盖的可能性,因此做你不指望的事情。如果课程是最终课程或设定者是最终课程,则不成问题。 – vextorspace