Java10-枚举类与注解

NiuMT 2020-06-03 20:58:30
Java

枚举类

类的对象只有有限个,确定的。当需要定义一组常量时,强烈建议使用枚举类。若枚举只有一个对象 , 则可以作为一种单例模式的实现方式。

枚举类的属性

自定义枚举类

  1. 私有化 类的构造器,保证不能在类的外部创建其对象
  2. 在类的内部创建枚举类的实例。声明为: public static final
  3. 对象如果有实例变量,应该声明为 private final ,并在构造器中初始化
class Season{
    private final String SEASONNAME;// 季节的名称
    private final String SEASONDESC;// 季节的描述
    private Season(String seasonName, String seasonDesc){
        this.SEASONNAME = seasonName;
        this.SEASONDESC = seasonDesc;
    }
    public static final Season SPRING = new Season( "春天", "春暖花开");
    public static final Season SUMMER = new Season( "夏天", "夏日炎炎");
    public static final Season AUTUMN = new Season( "秋天", "秋高气爽");
    public static final Season WINTER = new Season( "冬天", "白雪皑皑");
}

使用 enum 定义枚举类

使用说明

JDK 1.5 中可以在 switch 表达式中使用 Enum 定义的枚举类的对象作为表达式 , case 子句可以直接使用枚举值的名字 , 无需添加枚举类作为限定。

enum Season{
    SPRING( "春天", "春暖花开"),
    SUMMER( "夏天", "夏日炎炎"),
    AUTUMN( "秋天", "秋高气爽"),
    WINTER( "冬天", "白雪皑皑");

    private final String SEASONNAME;// 季节的名称
    private final String SEASONDESC;// 季节的描述
    private Season(String seasonName, String seasonDesc){
        this.SEASONNAME = seasonName;
        this.SEASONDESC = seasonDesc;
    }

}

Enum 类 的主要方法:

  1. values() 方法 :返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
  2. valueOf (String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException 。
  3. toString()toString():返回当前枚举类对象常量的名称

image-20201021170930378

interface Info{
    show();
}

//情况一
enum Season implements Info{
    SPRING( "春天", "春暖花开"),
    SUMMER( "夏天", "夏日炎炎"),
    AUTUMN( "秋天", "秋高气爽"),
    WINTER( "冬天", "白雪皑皑");

    private final String SEASONNAME;// 季节的名称
    private final String SEASONDESC;// 季节的描述
    private Season(String seasonName, String seasonDesc){
        this.SEASONNAME = seasonName;
        this.SEASONDESC = seasonDesc;
    }
    // 所有对象执行相同的行为方式
    show(){
        System.out.println("XXXXXXXXXXXX");
    }

}

//情况二
enum Season implements Info{
    // 对象执行不同的行为方式
    // 在对象内部定义需要重写的接口
    SPRING( "春天", "春暖花开"){
        show(){
            System.out.println("11111");
        }
    },
    SUMMER( "夏天", "夏日炎炎"){    
        show(){
            System.out.println("22222");
        }},
    AUTUMN( "秋天", "秋高气爽"){
        show(){
            System.out.println("333333");
        }
    },
    WINTER( "冬天", "白雪皑皑"){
        show(){
            System.out.println("444444");
        }
    };

    private final String SEASONNAME;// 季节的名称
    private final String SEASONDESC;// 季节的描述
    private Season(String seasonName, String seasonDesc){
        this.SEASONNAME = seasonName;
        this.SEASONDESC = seasonDesc;
    }
}

注解

Annotation 其实就是代码里的 特殊标记 , 这些标记可以在编译 , 类加载 , 运行时被读取 , 并执行相应 的处理。通过 使用 Annotation, 程序员可以在不改变原有逻辑的情况下 , 在源文件中嵌入一些 补充 信息 。 代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。

Annotation 可以像修饰符一样被使用 , 可用于 修饰包 类 , 构造器 , 方法 , 成员变量 , 参数 , 局部变量的声明 , 这些信息被保存在 Annotation的 “name=value” 对中 。

未来的开发模式都是基于注解的, JPA 是基于注解的, Spring2.5 以上都是基于注解的, Hibernate3.x 以后也是基于注解的,现在的Struts2 有一部分也是基于注解的了,注解是一种趋势 ,一定程度上可以说: ==框架 = 注解 + 反射 + 设计模式==。

使用 Annotation 时要在其前面增加 @ 符号 , 并 把该 Annotation 当成一个修饰符使用。 用于修饰它支持的程序元素

生成文档相关的注解

在编译时进行格式检查 (JDK 内置的三个基本注解)

跟踪代码依赖性,实现替代配置文件功能

image-20201021173339467

image-20201021173351873

自定义Annotation

@MyAnnotation( value = "尚硅谷")
public class MyAnnotationTest {
    public static void main(String[] args )
        Class clazz = MyAnnotationTest.class;
        Annotation a = clazz.getAnnotation(MyAnnotation.class);
        MyAnnotation m = (MyAnnotation)a;
        String info = m.value();
        System.out.println(info);
    }
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface MyAnnotation{
    String value() default "尚硅谷";
}

元注解

JDK 的元 Annotation 用于修饰其他 Annotation 定义

JDK5.0 提供了 4 个标准的 meta-annotation 类型分别是:

1.@Retention : 只能用于修饰一个 Annotation 定义 , 用于指定该 Annotation 的生命周期,@Rentention 包含一个 RetentionPolicy 类型的成员变量 , 使用@Rentention 时必须为该 value 成员变量指定值

2.@Target : 用于修饰 Annotation 定义 , 用于指定被修饰的 Annotation 能用于修饰哪些程序元素。 @Target 也包含一个名为 value 的成员变量。

3.@Documented:定义为 Documented 的注解必须设置 Retention 值为 RUNTIME 。

4.@Inherited: 被它修饰的 Annotation 将具有继承性 。如果某个类使用了被@Inherited 修饰的 Annotation, 则其子类将自动具有该注解。

JDK8新特性

Java 8对注解处理提供了两点改进: 可重复的注解及可用于类型的注解 。此外,反射也得到了加强,在 Java8 中能够得到方法参数的名称。这会简化标注在方法参数上的注解。

  1. 可重复注解:第一步:在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class;第二步:MyAnnotation的Target和Retention等元注解和MyAnnotationa相同。Inherited也需一致。

    image-20201021220555281

  2. 类型注解:TYPE_PARAMETER,TYPE_USE

在 Java 8 之前 注解只能是在声明的地方所使用 Java 8 开始 注解可以应用
在任何地方 。