【问题标题】:How to put annotation on getter or setter automatically generated by Groovy compiler?如何在 Groovy 编译器自动生成的 getter 或 setter 上添加注解?
【发布时间】:2011-07-10 16:42:54
【问题描述】:

Groovy 会自动生成 getter 和 setter,例如当我输入时:

int someField

我得到了字段 + getter + setter。现在我想在 setter 上添加注释(例如 GContracts 中的 @Requires/Ensures):

@Ensures({someField >= 0 && someField <= 100})
int someField

然后我得到错误:元素 FIELD 上不允许注释 groovy.lang.GrUnit - GrUnit 和 GContracts 仅识别方法上的注释。解决方法是显式编码 getter:

@Requires({...})
void setSomeField(int newValue) { ... }

有没有更好的解决方案?在 Scala 中有一个优雅的解决方案:http://www.scala-lang.org/api/current/scala/annotation/target/package.html

Groovy 中有类似的东西吗?或者:也许 GContracts 有一些解决方法来允许此类注释?

【问题讨论】:

    标签: scala groovy annotations


    【解决方案1】:

    Groovy 编译器中有 9 个编译阶段。 getter 和 setter 是在编译阶段很晚才生成的,它们是在 GContracts 运行之后生成的。

    如果您想让您的代码看起来好像生成的 getter/setter 已被注释,那么您必须自己生成 getter/setter 对并对其进行注释。具体来说,将两个新的 FieldNode 添加到 ClassNode(只要它们不存在)。字段节点是 AnnotatedNode,因此您可以添加所需的任何注释。只要您在 GContracts 运行之前 的某个阶段执行此操作,那么 GContracts 就永远不会知道不同之处。

    也就是说,这听起来像是 GContracts 功能请求。

    【讨论】:

      【解决方案2】:

      如您所述,GContracts 不提供字段注释(当前版本:1.2.4)。它甚至不会对可能在 GContracts 运行之前添加的合成(生成)方法执行 AST 转换。

      简而言之:一个简单的解决方法是添加自定义 setter 方法。

      另一方面,如果你用 @Invariant 来注解一个类,它持有一个类不变量,它会为所有属性预先生成 setter 方法,以便在执行 setter 方法之前和之后检查类不变量。

      话虽如此,可能值得考虑在该过程中包含 @Requires 和 @Ensures - 我创建了一个问题:http://gcontracts.lighthouseapp.com/projects/71511-gcontracts-core/tickets/32

      【讨论】:

        猜你喜欢
        • 2015-08-25
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-16
        • 2014-11-12
        • 1970-01-01
        • 2010-11-03
        相关资源
        最近更新 更多