在我们结束属性主题之前,我们有些例子要探讨:列表 7.20。在列表中介绍了你怎样提供自己的访问方法和绕开访问方法的机制,在需要的时候你能够使用.@操作符直接访问属性。
我们从熟悉的地方入手:在(3)的地方 bean.value 调用的是 get Valu e 并且其结果是返 回双精度数,但是 getValue 的计算结果为 value * 2,如(2)所示,如果 value 在这里 bean 快捷方式为 getValu e,我们将有一个递归的结果。
相似的情况发生在(1)处,赋值语句 this.value = 在 bean 中将被解释为 this.setValue,这也让我们掉入一个无限循环中,因此,groovy 安排了下列规则。
规则:在类内部,引用 f ieldName 或者 this.fieldName 将被解释为直接属性访问,而不是bean 风格的属性访问(通过访问方法进行);在类的外部,可以使用 ref erence.@f ieldName 语法直接访问类属性。
需要提到的是,这些规则能产生符合逻辑但是让人意外的反常的用例,如从一个静态上下文中使用@或者使用这样的语句 def x = this; x.@fieldn ame,等等。
我们将不进行更详细的讨论,因为这样的设计是不合理的,决定是否通过类属性,bean 方式的属性,或者通过显式的访问方法来暴露一个状态,不要混合使用,保持访问的一致性。