ITPub博客

首页 > Linux操作系统 > Linux操作系统 > JavaFX教程-增量式求值和懒惰求值

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

原创 Linux操作系统 作者:梧桐雨—168 时间:2008-03-18 16:57:58 0 删除 编辑

在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/,如需转载,请注明出处,否则将追究法律责任。

下一篇: JavaFX教程-反射
请登录后发表评论 登录
全部评论

注册时间:2008-02-28

  • 博文量
    141
  • 访问量
    402046