📜  Java8 repeating and type annotations

📅  最后修改于: 2020-10-13 05:25:49             🧑  作者: Mango

Java类型和重复注释

Java类型注释

Java 8在其先前的注释主题中包括重复和类型注释两个新功能。在早期的Java版本中,您只能将注释应用于声明。在发布Java SE 8之后,可以将注释应用于任何类型使用。这意味着注释可以在使用类型的任何地方使用。例如,如果要避免在代码中出现NullPointerException,则可以声明一个字符串变量,如下所示:

@NonNull String str;

以下是类型注释的示例:

@NonNull List
List<@NonNull String> str
Arrays<@NonNegative Integer> sort
@Encrypted File file
@Open Connection connection
void divideInteger(int a, int b) throws @ZeroDivisor ArithmeticException

注-Java创建了类型注释,以支持改进的Java程序分析。它支持确保更强大的类型检查的方法。

Java重复注释

在Java 8版本中,Java允许您在源代码中重复注释。当您想为同一类重用注释时,这将很有帮助。您可以在使用标准注释的任何地方重复注释。

出于兼容性原因,重复注释存储在Java编译器自动生成的容器注释中。为了使编译器执行此操作,您的代码中需要两个声明。

  • 声明可重复的注释类型
  • 声明包含的注释类型

1)声明可重复的注释类型

声明可重复注释类型必须使用@Repeatable元注释进行标记。在下面的示例中,我们定义了一个自定义@Game可重复注释类型。

@Repeatable(Games.class)
@interfaceGame{
String name();
String day();
}

括号中的@Repeatable元注释的值是Java编译器生成的用于存储重复注释的容器注释的类型。在以下示例中,包含的注释类型为“游戏”。因此,重复的@Game批注存储在@Games批注中。

2)声明包含的注释类型

包含注释类型的值元素必须具有数组类型。数组类型的组件类型必须是可重复的注释类型。在下面的示例中,我们声明游戏包含注释类型:

@interfaceGames{
Game[] value();
}

注意-如果将相同的注释应用于声明而不先声明为可重复,则编译器将引发编译时错误。

Java重复注释示例

// Importing required packages for repeating annotation 
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
// Declaring repeatable annotation type
@Repeatable(Games.class)
@interfaceGame{
String name();
String day();
}
// Declaring container for repeatable annotation type
@Retention(RetentionPolicy.RUNTIME)
@interfaceGames{
Game[] value();
}
// Repeating annotation
@Game(name = "Cricket",  day = "Sunday")
@Game(name = "Hockey",   day = "Friday")
@Game(name = "Football", day = "Saturday")
public class RepeatingAnnotationsExample {
public static void main(String[] args) {
// Getting annotation by type into an array
Game[] game = RepeatingAnnotationsExample.class.getAnnotationsByType(Game.class);
for (Gamegame2 : game) {// Iterating values
System.out.println(game2.name()+" on "+game2.day());
}
}
}

输出:

Cricket on Sunday
Hockey on Friday
Football on Saturday