Java8 类型与Repeatable注解

1 Java Type注解

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

@NonNull String str;  

以下是类型注释的示例:

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

2 Java Repeatable注解的介绍

在Java 8版本中,Java允许您在源代码中使用@Repeatable注解。当您想为同一类重用注解时,这将很有帮助。您可以在使用标准注解的任何地方重复注解。
出于兼容性原因,Repeatable注解存储在Java编译器自动生成的容器注释中。为了使编译器执行此操作,您的代码中需要两个声明。

  1. 声明可重复的注解类型
  2. 声明包含的注解类型

3 Java Repeatable注解的声明

3.1 声明可重复的注解类型

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

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

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

3.2 声明包含的注解类型

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

@interfaceGames{  
    Game[] value();  
}  

4  Java Repeatable注解的案例

/**
 * 一点教程网: http://www.yiidian.com
 */
// 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

 

热门文章

优秀文章