からセッターを呼び出すために、私は次のクラスデシリアライズ/シリアライズしています:の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
が更新されるように、これを修正する方法がありますか?
私は可能なアプローチのカップルを想像することができますが、私はどちらかが最良であるかわからない:
Condition
Observable
クラスを作成し、追加ChangeListener
へconditionText
- カスタムを書くを更新
condition
すべてのプロパティの既定のデシリアライザをBranch
として呼び出し、Branch
Branch
のデシリアライザ
あなたのご提案ありがとうございます!
コンストラクタからだけでなく、setConditionを呼び出すと、contictionText変数を初期化するものが何もないので、nullポインタ例外が常に発生するはずです。 – DwB
はい、 'SimpleStringProperty'コンストラクタへの呼び出しを含めるのを忘れました。それは私の元のソースコードに入っていたので、私の問題の原因ではありませんでした。ここでコンストラクタ呼び出しを追加しました。 – skrilmps
私が知る限り、コンストラクタからセッターを呼び出す唯一の問題は、セッターがオーバーライドされて、あなたが期待していないことをする可能性があることです。クラスがファイナルであるかセッターがfinalである場合は問題ありません。 – vextorspace