Java 重复注释的实际用途是什么?

Java 重复注释的实际用途是什么?,java,java-8,Java,Java 8,实际上,我正在经历Java8中的新事物。有很多新东西出现了,比如Lambda表达式、默认方法等等 其中一个特点是重复注释 “重复批注提供了将同一批注类型多次应用于同一声明或类型使用的功能” 在这里,我可以理解我可以多次使用相同的注释 我正在努力了解此添加项的实际用途。并试图理解为什么他们在java 7之前错过了它。例如,如果您有一些基于角色的安全性,您将能够编写如下内容: @Authorize(role="USER") @Authorize(role="ADMIN") public void d

实际上,我正在经历Java8中的新事物。有很多新东西出现了,比如Lambda表达式、默认方法等等

其中一个特点是重复注释

“重复批注提供了将同一批注类型多次应用于同一声明或类型使用的功能”

在这里,我可以理解我可以多次使用相同的注释


我正在努力了解此添加项的实际用途。并试图理解为什么他们在java 7之前错过了它。

例如,如果您有一些基于角色的安全性,您将能够编写如下内容:

@Authorize(role="USER")
@Authorize(role="ADMIN")
public void doStuff(){
...codez
}
@Authorize(roles={"USER", "ADMIN"})
public void doStuff(){
...codez
}
@Cron(values={"* * * * * 10", "12 * * * * 0", "4 * 5 * 6 * 7"})
public void doCron(){

}
在以前的Java版本中,要实现同样的效果,必须执行以下操作:

@Authorize(role="USER")
@Authorize(role="ADMIN")
public void doStuff(){
...codez
}
@Authorize(roles={"USER", "ADMIN"})
public void doStuff(){
...codez
}
@Cron(values={"* * * * * 10", "12 * * * * 0", "4 * 5 * 6 * 7"})
public void doCron(){

}

正如您自己所看到的,差异是最小的,@Repeatable注释在语法上比一个巨大的突破更具吸引力。除非你考虑一些更冗长的注释,否则,好处就不明显了。在java 8之前,您必须执行以下操作:

@Authorize(role="USER")
@Authorize(role="ADMIN")
public void doStuff(){
...codez
}
@Authorize(roles={"USER", "ADMIN"})
public void doStuff(){
...codez
}
@Cron(values={"* * * * * 10", "12 * * * * 0", "4 * 5 * 6 * 7"})
public void doCron(){

}

但是在Java8中,每行可以有一个单独的cron,这使得表达式更具可读性。

答案很明显:您希望用多个值来注释某些内容

在此功能之前,您需要解析注释处理代码中允许的单个参数:

@SomeAnnotation(value="this,that")
String foo;
或(根据评论):


注释处理代码需要有逻辑来处理拆分值并对其进行处理,或者获取多个值。从逻辑的角度来看,允许多个注释使这变得更简单。这只是一个方便的功能

如果在注释中声明了多个字段,这将非常有用。例如:

@Repeatable
public @interface Role {
   String type;
   String[] allowed;
}
在这种情况下,对多个角色使用这种注释要容易得多:

@Role(type="readonly", allowed={"view"})
@Role(type="admin", allowed={"view,add,update,delete"})
public boolean checkAllowed() {
}

我们还可以将它们写成@Authorize(roles=“ADMIN,User”)public void doStuff(){…codez}。我们可以用多种方式编写所有内容。Java8刚刚添加了一种新的编写方法。想象一下,如果不是角色,而是一堆石英cron表达式。如果每一个都在一条单独的线上,那就更好了。但再一次,Repeatable为java8添加的更多的是一种语法上的糖分,而不是从设计角度考虑的东西。处理同一类型的多个注释的代码更简单。我进行了编辑,以便更清楚地说明这只是一个方便的功能。这是不正确的,如果没有包装类作为它的值,您就不能定义
@Repeatable