【java注解使用场景笔记】简单上手版

338 阅读2分钟

一、接口标记场景

@Deprecated

使用场景:标示该接口已过时

阿里规约:外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生影响。接口过时必须加 @Deprecated 注解,并清晰地说明采用的新接口或新服务是什么。

@SuppressWarnings

使用场景:对接口内产生的某些警告保持静默,例如可以忽略未使用变量的警告等

@SuppressWarnings("unused")
public void test(){
    //忽略list未使用警告
    List list = new ArrayList();
}

@SafeVarargs

使用场景:抑制编译器“堆污染”警告,类似@SuppressWarnings("unchecked")注解,忽略类型检查

注意事项:@SafeVarargs注解不适用于非static或非声明的方法,参数必须是可变参数

@SafeVarargs
public static <T> void test(T ...array){
    //忽略list无类型检查
    List list = new ArrayList();
}

@FunctionalInterface

使用场景:标记接口为函数式接口

注意事项:

  • 只能用在接口上
  • 有且仅有一个抽象方法
  • 可以有静态方法和默认方法
  • 可以重写Object中方法,比如equals,toString
@FunctionalInterface
public interface FunctionTest{
    //抽象方法
    void method();
    //默认方法
    default void defaultMethod(){
        ...
    }
    //静态方法
    static void staticMethod(){
        ...
    }
}

二、类场景

@Override

使用场景:重写父类方法

new Thread(){
  @Override
  public void run() {
       ...
  }
};

@Target

使用场景:用于描述注解的使用范围

主要场景:自定义注解

ElementType:

  • TYPE:用于描述类、接口、注解、枚举
  • FIELD:用于描述字段、枚举的常量
  • METHOD:用于描述方法
  • PARAMETER:用于描述方法参数
  • CONSTRUCTOR:用于描述构造函数
  • LOCAL_VARIABLE:用于描述局部变量
  • ANNOTATION_TYPE:用于描述注解
  • PACKAGE:用于描述包
@Target(ElementType.TYPE)
public @interface Target{
    public String text() default "";
    ...
}

@Retention

使用场景:指定被修饰的注解可以保留多长时间(生命周期)

主要场景:自定义注解

RetentionPolicy:

  • SOURCE:只保留在源文件中,编译时注解会被遗弃
  • CLASS(默认值):会保留到class文件,当class文件被Load时会被遗弃
  • RUNTIME:注解不仅被保存到class文件中,Load之后,仍然存在
@Retention(RetentionPolicy.RUNTIME)
public @interface Retention{
    ...
}

@Documented

使用场景:其修饰的注解会保存到 API 文档中

主要场景:自定义注解

@Inherited

使用场景:其修饰的注解可以被子类所继承

主要场景:自定义注解

@Inherited
public @interface test{
    ...
}

@test
public Class Parent{
    ...
}

public Class child extents Patent{
    ...
}