快捷搜索: 王者荣耀 脱发

JDK 8 新特性 | 重复注解与类型注解

Java 8对注解处理提供了两点改进:可重复的注解及可用于类型的注解。

重复注解


重复注解:即允许在同一申明类型(类,属性,或方法)前多次使用同一个类型注解。

在java8 以前,同一个程序元素前最多只能有一个相同类型的注解;如果需要在同一个元素前使用多个相同类型的注解,则必须使用注解“容器”。

public @interface Authority {
          
   
     String role();
}

public @interface Authorities {
          
      //@Authorities注解作为可以存储多个@Authority注解的容器
    Authority[] value();
}

public class RepeatAnnotationUseOldVersion {
          
   
    @Authorities({
         
  @Authority(role="Admin"), @Authority(role="Manager")})
    public void doSomeThing(){
    }
}

java8 新增了重复注解,其使用方式为:

@Repeatable(Authorities.class)
public @interface Authority {
          
   
     String role();
}

public @interface Authorities {
          
   
    Authority[] value();
}

public class RepeatAnnotationUseNewVersion {
          
   
    @Authority(role="Admin")
    @Authority(role="Manager")
    public void doSomeThing(){ }
}

不同的地方是,创建重复注解 Authority 时,加上@Repeatable,指向存储注解 Authorities,在使用时候,直接可以重复使用 Authority 注解。从上面例子看出,java 8里面做法更适合常规的思维,可读性强一点。但是,仍然需要定义容器注解。

两种方法获得的效果相同。重复注解只是一种简化写法,这种简化写法是一种假象:多个重复注解其实会被作为“容器”注解的 value 成员的数组元素处理。

类型注解


Java8 为 ElementType 枚举增加了TYPE_PARAMETER、TYPE_USE两个枚举值,从而可以使用 @Target(ElementType_TYPE_USE) 修饰注解定义,这种注解被称为类型注解,可以用在任何使用到类型的地方。

在 java8 以前,注解只能用在各种程序元素(定义类、定义接口、定义方法、定义成员变量…)上。从 java8 开始,类型注解可以用在任何使用到类型的地方。

TYPE_PARAMETER:表示该注解能写在类型参数的声明语句中。 类型参数声明如: <T>、<T extends Person>

TYPE_USE:表示注解可以再任何用到类型的地方使用,比如允许在如下位置使用:

  1. 创建对象(用 new 关键字创建)
  2. 类型转换
  3. 使用 implements 实现接口
  4. 使用 throws 声明抛出异常
@Target(ElementType.TYPE_USE)
@interface NotNull{

}

// 定义类时使用
// 在implements时使用
@NotNull
public class TypeAnnotationTest implements Serializable {
          
   

    // 在方法形参中使用
    // 在throws时使用
    public static void main(@NotNull String [] args) throws @NotNull FileNotFoundException {

        Object  obj = "fkjava.org";

        // 使用强制类型转换时使用
        String str = (@NotNull String) obj;

        // 创建对象时使用
        Object win = new (@NotNull) JFrame("疯狂软件");   
    } 

    // 泛型中使用
    public void foo(List<@NotNull String> info) {

    }
}

这种无处不在的注解,可以让编译器执行更严格的代码检查,从而提高程序的健壮性。

需要指出的是,上面程序虽然使用了大量 @NotNull 注解,但是这些注解暂时不会起任何作用——因为没有为这些注解提供处理工具,

java8本身并没有提供,要想这些注解发挥作用,需要开发者自己实现,或者使用第三方提供的工具。

经验分享 程序员 微信小程序 职场和发展