# Groovy 使用.@进行属性访问

**URL:** <https://www.isharkfly.com/t/groovy/1938>\
**Category:** 程序语言\
**Created:** [December 15, 2012, 1:24am UTC](https://www.isharkfly.com/t/groovy/1938 "2012-12-15T01:24:49Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [December 15, 2012, 1:24am UTC](https://www.isharkfly.com/t/groovy/1938/1 "2012-12-15T01:24:49Z")

</div>

在我们结束属性主题之前，我们有些例子要探讨：列表 7.20。在列表中介绍了你怎样提供自己的访问方法和绕开访问方法的机制，在需要的时候你能够使用.@操作符直接访问属性。

![](https://www.isharkfly.com/images/transparent.png)

我们从熟悉的地方入手：在（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 方式的属性，或者通过显式的访问方法来暴露一个状态，不要混合使用，保持访问的一致性。
