一个元素上的多个相同类型的注释? [英] Multiple annotations of the same type on one element?

查看:27
本文介绍了一个元素上的多个相同类型的注释?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在单个元素(在本例中为方法)上添加两个或多个相同类型的注释.这是我正在使用的大致代码:

public class Dupe {公共@interface Foo {字符串 bar();}@Foo(bar="one")@Foo(bar="两个")公共无效哈哈() {}}

在编译上述内容时,javac 抱怨重复注释:

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

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

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

更新:我被要求描述我的用例.来了.

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

公共类员工{私人列表<项目>项目;@Index(expr = "project.client_id")@Index(expr = "project.start_date")公共列表<项目>getProjects() { 返回项目;}}

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

解决方案

不允许使用两个或多个相同类型的注释.但是,您可以执行以下操作:

public @interface Foos {Foo[] 值();}@Foos({@Foo(bar="one"), @Foo(bar="two")})公共无效哈哈() {}

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

顺便说一句,我 2 小时前刚刚使用它来解决同样的问题:)

I'm attempting to slap two or more annotations of the same type on a single element, in this case, a method. Here's the approximate code that I'm working with:

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

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

When compiling the above, javac complains about a duplicate annotation:

max@upsight:~/work/daybreak$ javac Dupe.java 
Dupe.java:5: duplicate annotation

Is it simply not possible to repeat annotations like this? Pedantically speaking, aren't the two instances of @Foo above different due to their contents being different?

If the above isn't possible, what are some potential workarounds?

UPDATE: I've been asked to describe my use case. Here goes.

I'm building a syntax sugarish mechanism to "map" POJOs to document stores such as MongoDB. I want to allow indexes to be specified as annotations on the getters or setters. Here's a contrived example:

public class Employee {
    private List<Project> projects;

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

Obviously, I want to be able to quickly find instances of Employee by various properties of Project. I can either specify @Index twice with different expr() values, or take the approach specified in the accepted answer. Even though Hibernate does this and it's not considered a hack, I think it still makes sense to at least allow having multiple annotations of the same type on a single element.

解决方案

Two or more annotations of same type aren't allowed. However, you could do something like this:

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

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

You'll need dedicated handling of Foos annotation in code though.

btw, I've just used this 2 hours ago to work around the same problem :)

这篇关于一个元素上的多个相同类型的注释?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆