一个元素上有多个相同类型的注释?

新手上路,请多包涵

我试图在单个元素上添加两个或更多相同类型的注释,在本例中是一个方法。这是我正在使用的大概代码:

 public class Dupe {
    public @interface Foo {
      String bar();
    }

    @Foo(bar="one")
    @Foo(bar="two")
    public void haha() {}
}

编译上面的代码时,javac 抱怨重复注释:

max@upsight:~/work/daybreak$ javac Dupe.java
Dupe.java:5: 重复注解

像这样重复注释是不可能的吗?迂腐地说,上面的两个 @Foo 实例不是因为它们的内容不同而不同吗?

如果上述不可能,有哪些潜在的解决方法?

更新:我被要求描述我的用例。开始。

我正在构建一个语法糖机制来将 POJO“映射”到 MongoDB 等文档存储。我想允许将索引指定为 getter 或 setter 上的注释。这是一个人为的例子:

 public class Employee {
    private List<Project> projects;

    @Index(expr = "project.client_id")
    @Index(expr = "project.start_date")
    public List<Project> getProjects() { return projects; }
}

显然,我希望能够通过 Project 的各种属性快速找到 Employee 的实例。我可以使用不同的 expr() 值指定 @Index 两次,或者采用接受的答案中指定的方法。尽管 Hibernate 这样做并且它不被认为是 hack,但我认为至少允许在单个元素上具有相同类型的多个注释仍然有意义。

原文由 Max A. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 441
2 个回答

注意:由于 Java 8 引入了 @Repeatable 注释,此答案部分已过时(请参阅@mernst 的回答)。对 @Foos 容器注释和专用处理的需求仍然存在。

不允许使用两个或多个相同类型的注释。但是,您可以这样做:

 public @interface Foos {
    Foo[] value();
}

// pre Java 8
@Foos({@Foo(bar="one"), @Foo(bar="two")})
public void haha() {}

// post Java 8 with @Repeatable(Foos.class) on @Foo
@Foo(bar="one") @Foo(bar="two")
public void haha() {}

不过,您需要在代码中专门处理 Foos 注释。

原文由 sfussenegger 发布,翻译遵循 CC BY-SA 4.0 许可协议

Java 8 中的重复注解

Java 8 (2014 年 3 月发布)中,可以编写重复/重复的注释。

请参阅教程, 重复注释

请参阅规范, JEP 120:重复注释

原文由 mernst 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题