2016-11-08 4 views
0

は、私は次のコードスニペットを持っていると仮定しますJavaFXは周期的なプロパティバインディングをどのように処理しますか?

 private final BooleanProperty a = new SimpleBooleanProperty(false); 
     private final BooleanProperty b = new SimpleBooleanProperty(false); 
     private final BooleanProperty c = new SimpleBooleanProperty(false); 
     private final BooleanProperty d = new SimpleBooleanProperty(false); 

     a.bind(c); 
     c.bind(d.or(a)); 

どのようにJavaFXのはそれを処理しますか? aはcに依存しているため、 ですが、cはdまたはaに依存しています。そのような「例外」を認識する式はありますか?

私の最初の考えは、property_aにバインドされた別のproperty_bにバインドできないか、property_aにバインドされたプロパティを持つプロパティにも依存するということです。右?

答えて

0

JavaFXはこの種の依存性を防止しません。
依存関係にサイクルは存在せず、この場合には許可されることはありません。依存関係の分析は不可能です。bindは、実装に関係なく、パラメータとしてObservableValueを受け取り、インプリメンテーションの内部は「インタフェースの後ろ」に隠されているため、ObservableValueから依存関係を取得することは不可能です。
したがって、循環依存が作成されていないことを確認することはプログラマの責任です。

dを変更すると、StackOverflowErrorになります。

「依存」関係を分析する場合(推移閉包は非反映である必要がありますが)、依存関係に関する情報をカスタムデータ構造に格納する必要がありますコンパイルする前に "手で")。

有向グラフはこの種の情報を格納するのに適しており、循環依存関係が確立されないことを前提として、バインドするプロパティの依存関係の深さを最初に検索できます。 (依存関係グラフが森であるため、DFSは、十分です。)グラフは、単一のエッジ含んでいるでしょう、あなたのケースで

a.bind(c)後:あなたはノードを検索する必要がc.bind(d.or(a))を行う前に

a -> c 

dcへの依存関係のためa、あなたは以下のエッジを追加したいので、:

c -> d 
c -> a 

dはバインドされていませんが、aからcに移動することができます。このバインドはPropertyです。この依存関係は作成しないでください。

+0

ありがとう –

関連する問題