JavaFX教程-增量式求值和懶惰求值

梧桐雨—168發表於2008-03-18

在JavaFX中,屬性初始化程式能夠使用bind操作符進行懶惰、增量式求值。使用bind初始化的屬性類似於包含公式的電子表格中的單元格。在包含此屬性的物件的生命週期中,只要在初始化表示式右側引用的任何物件發生改變,其左側的物件屬性將被自動更新。示例如下:

  import java.lang.System;

 class X {
  attribute a: Number;
  attribute b: Number;
  attribute c: Number;
 }
 
 trigger on X.b = newValue {
  System.out.println("X.b is now {newValue}");
 }
 
 trigger on X.c = newValue {
  System.out.println("X.c is now {newValue}");
 }
 
 var x1 = X {
  a: 1
  b: 2   // X.b is now 2 is printed
  c: 3   // X.c is now 3 is printed
 };
 
 var x2 = X {
  a:  x1.a       // eager, non-incremental
  b:  bind x1.b // eager, incremental (X.b is now 2 is printed)
  c:  bind lazy x1.c  // lazy, incremental (nothing is printed yet)
 };

 System.out.println(x2.a); // prints 1
 System.out.println(x2.b); // prints 2
 System.out.println(x2.c); // prints X.c is now 3, then prints 3
 
 x1.a = 5;
 x1.b = 5; // prints X.b is now 5, twice
 x1.c = 5; // prints X.c is now 5, twice
 
 System.out.println(x2.a); // prints 1
 System.out.println(x2.b); // prints 5
 System.out.println(x2.c); // prints 5
上例中,x2的屬性b和c被繫結到x1的屬性b和c。這意味著當x1的b或c屬性被更新時,x2的b或c屬性都會相應地被更新。在x2中的b、c屬性之間的不同是:前者的屬性值在其屬性初始化程式中被立即更新,而後者的繫結直到其值被訪問時才被求值。

注意:函式體無需bind操作符便可被增量地求值,但操作體則做不到。在改變本地變數的操作中並不觸發增量式求值。增量式求值不能在操作體內執行,除了表示式明確地以bind作為字首。

然而,當你在一個增量式求值上下文中呼叫操作或者Java方法,此呼叫本身將被增量式求值。這意味著如果此呼叫變成了對操作或者Java方法的全新呼叫(由於此呼叫被增量式求值),那麼它所用到的任何引數值將被使用並返回新值。

譯者注:此處的新值是與不進行增量式求值相比。

相反,在增量式求值上下文中呼叫函式,此函式只能被呼叫一次,而其求值結果也將被合併到呼叫求值樹中。

增量式求值是JavaFX的主要特徵,它使定義複雜的動態GUI宣告成為了可能。懶惰求值的特性常用在處理像tree或者graph這樣的遞迴資料結構上。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13270562/viewspace-209698/,如需轉載,請註明出處,否則將追究法律責任。

相關文章