[英]Java: when/how to call a setter from constructor and GSON deserializer
我正在序列化/反序列化以下类:
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
的setter,因此从未设置过conditionText
的值。
有没有办法解决这个问题,或者做一个更好的方式,这样conditionText
无论何时更新condition
更新,即使是在GSON反序列化?
我可以想象有两种可能的方法,但是我不确定哪一种是最好的:
Condition
的Observable
类和添加ChangeListener
来condition
,更新conditionText
Branch
,只是调用上的每一个属性的默认解串器Branch
,然后调用的构造Branch
感谢您的建议!
我最终采用的方法是上面的#2。
我为Branch编写了一个自定义解串器。 它所做的只是为Branch的每个元素调用上下文的反序列化器,每个元素都存储在局部变量中。 然后,我调用Branch的构造函数,传入本地存储的变量,然后返回结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.