2016-11-17 3 views
2

からセッターを呼び出すために、私は次のクラスデシリアライズ/シリアライズしています:の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の目的は、condition.toString()の結果をGUIが必要とするときに提供するだけです(そのため、StringPropertyです)。 conditionTextの値は、セッターでconditionのために更新されます。理論的にはconditionが変更されるたびにconditionTextが適切に更新されます。

Branchの構築時にconditionTextが設定されるように、コンストラクタもsetCondition()を呼び出します。 [サイド質問:コンストラクタからセッターを呼び出すことは悪い習慣だと聞いたことがありますが、このようなシナリオでは意味がありませんか? ]

デフォルトのGSONデシリアライザを使用してBranchを非直列化すると、すべてが期待どおりになります。しかし、私が遭遇している問題は、デシリアライゼーション中にconditionのセッターが呼び出されないことがあるため、conditionTextの値は決して決して設定されません。

GSONのデシリアライズ中にconditionが更新されるたびにconditionTextが更新されるように、これを修正する方法がありますか?

私は可能なアプローチのカップルを想像することができますが、私はどちらかが最良であるかわからない:

  1. ConditionObservableクラスを作成し、追加ChangeListenerconditionText
  2. カスタムを書くを更新conditionすべてのプロパティの既定のデシリアライザをBranchとして呼び出し、Branch
のコンストラクタを呼び出した Branchのデシリアライザ

あなたのご提案ありがとうございます!

+0

コンストラクタからだけでなく、setConditionを呼び出すと、contictionText変数を初期化するものが何もないので、nullポインタ例外が常に発生するはずです。 – DwB

+0

はい、 'SimpleStringProperty'コンストラクタへの呼び出しを含めるのを忘れました。それは私の元のソースコードに入っていたので、私の問題の原因ではありませんでした。ここでコンストラクタ呼び出しを追加しました。 – skrilmps

+1

私が知る限り、コンストラクタからセッターを呼び出す唯一の問題は、セッターがオーバーライドされて、あなたが期待していないことをする可能性があることです。クラスがファイナルであるかセッターがfinalである場合は問題ありません。 – vextorspace

答えて

0

私が取り上げたアプローチは上記の#2でした。

ブランチ用のカスタムデシリアライザを作成しました。それが行うのは、Branchのすべての要素に対してコンテキストのデシリアライザを呼び出すことです。それぞれは、ローカル変数に格納されています。次に、Branchのコンストラクタを呼び出し、ローカルに格納されている変数を渡して、結果を返します。

関連する問題