2016-11-17 48 views
2

我序列化调用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反序列化期间也是如此?

我可以想像一对夫妇可能的方法,但我也不清楚是最好的:

  1. Condition一个Observable类,并添加一个ChangeListenercondition,更新conditionText
  2. 编写自定义Branch的解串器,它只调用Branch的每个属性的默认解串器,然后调用构造函数Branch

感谢您的建议!

+0

如果你调用setCondition,永远(不仅仅是来自构造函数),你应该总是得到一个空指针异常,因为什么都没有初始化contictionText变量,这意味着它是空的。 – DwB

+0

是的,我忘了将调用包含到'SimpleStringProperty'构造函数中。这已经在我原来的源代码中,所以这不是我的问题的原因。我现在也在这里添加了构造函数调用。 – skrilmps

+1

据我所知,从构造函数调用setter的唯一问题是你的setter被覆盖的可能性,因此做你不指望的事情。如果课程是最终课程或设定者是最终课程,则不成问题。 – vextorspace

回答

0

我最终采取的方法是#2以上。

我为分支写了一个自定义解串器。它所做的就是调用上下文的解串器来处理分支的每个元素,每个元素都存储在局部变量中。然后我调用Branch的构造函数,传入本地存储的变量,并返回结果。