繁体   English   中英

Java:何时/如何从构造函数和GSON反序列化器调用setter

[英]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反序列化?

我可以想象有两种可能的方法,但是我不确定哪一种是最好的:

  1. 制作ConditionObservable类和添加ChangeListenercondition ,更新conditionText
  2. 编写自定义解串器Branch ,只是调用上的每一个属性的默认解串器Branch ,然后调用的构造Branch

感谢您的建议!

我最终采用的方法是上面的#2。

我为Branch编写了一个自定义解串器。 它所做的只是为Branch的每个元素调用上下文的反序列化器,每个元素都存储在局部变量中。 然后,我调用Branch的构造函数,传入本地存储的变量,然后返回结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM