枚举与注解 | Java自学笔记

176 阅读4分钟

枚举类的使用

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

如何自定义枚举类

  • 方式一:JDK5.0之前自定义枚举类

    //自定义枚举类
    class Season{
        //1.声明Season对象的属性:private final修饰
        private final String seasonName;
        private final String seasonDesc;
    
        //2.私有化构造器,并给对象属性赋值
        private Season(String seasonName, String seasonDesc) {
            this.seasonName = seasonName;
            this.seasonDesc = seasonDesc;
        }
    
        //3.提供当前枚举类的多个对象:public static final
        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("冬天","冰天雪地");
    
        //4.其他诉求:提供get方法
        public String getSeasonName() {
            return seasonName;
        }
    
        public String getSeasonDesc() {
            return seasonDesc;
        }
    
        //4.其他诉求:toString方法
        @Override
        public String toString() {
            return "Season{" +
                    "seasonName='" + seasonName + '\'' +
                    ", seasonDesc='" + seasonDesc + '\'' +
                    '}';
        }
    }
    

如何使用关键字enum定义枚举类

  • 方式二:JDK5.0,可以使用enum关键字定义枚举类

    public class SeasonTest1 {
    
        public static void main(String[] args) {
            Season1 summer = Season1.SUMMER;
            System.out.println(summer);
    
            System.out.println(Season1.class.getSuperclass());//class java.lang.Enum
        }
    }
    //使用enum关键字定义枚举类
    enum Season1{
        //1.提供当前枚举类的对象,多个对象之间用逗号隔开,末尾用分号
        SPRING("春天","春暖花开"),
        SUMMER("夏天","夏日炎炎"),
        AUTUMN("秋天","秋高气爽"),
        WINTER("冬天","冰天雪地");
    
        //2.声明Season对象的属性:private final修饰
        private final String seasonName;
        private final String seasonDesc;
    
        //3.私有化类的构造器,并给对象属性赋值
        private Season1(String seasonName, String seasonDesc) {
            this.seasonName = seasonName;
            this.seasonDesc = seasonDesc;
        }
    
        //4.其他诉求:提供get方法
        public String getSeasonName() {
            return seasonName;
        }
    
        public String getSeasonDesc() {
            return seasonDesc;
        }
    
    }
    

Enum类的主要方法

//toString():
System.out.println(summer.toString());

//values():
Season1[] values = Season1.values();
System.out.println(Arrays.toString(values));

//valueOf(String objName):返回枚举类中对象名是objName的对象
Season1 winter = Season1.valueOf("WINTER");
//如果没有objName的枚举类对象,则抛异常:IllegalArgumentException
System.out.println(winter);

实现接口的枚举类

  • 情况一:实现接口,在enum类中实现抽象方法

  • 情况二:让枚举类的对象分别实现接口中的抽象方法

    interface Info {
    		void show();
    }
    
    enum Season1{
        //1.提供当前枚举类的对象,多个对象之间用逗号隔开,末尾用分号
        SPRING("春天","春暖花开"){
    				@Override
    				public void show(){
    						System.out.println("春天在哪里");
    				}
    		}
        SUMMER("夏天","夏日炎炎"){
    				@Override
    				public void show(){
    						System.out.println("宁夏");
    				}
    		}
        AUTUMN("秋天","秋高气爽"){
    				@Override
    				public void show(){
    						System.out.println("秋天不回来");
    				}
    		}
        WINTER("冬天","冰天雪地"){
    				@Override
    				public void show(){
    						System.out.println("大约在冬季");
    				}
    		}
    }
    

注解(Annotation)

注解概述

  • 从JDK5.0开始,Java增加了对元数据(MetaData)的支持,也就是Annotation
  • Annotation其实就是代码里的特殊标记
  • Annotation可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被保存在Annotation的“name=value”对中
  • 未来的开发模式都是基于注解的,可以说框架=注解+反射+设计模式

常见的Annotation示例

  • 示例一:生成文档相关的注解

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

    • @Override:限定重写父类方法,该注解只能用于方法
    • @Deprecated:用于表示所修饰的元素(类、方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
    • @SuppressWarnings:抑制编译器警告
  • 示例三:跟踪代码的依赖性,实现替代配置文件功能

    • Servlet3.0提供了注解(annotation),使得不再需要web.xml文件中进行Servlet的部署
    • Spring框架中关于“事务“的管理

自定义Annotation

  • 参照@SuppressWarnings定义

    • 注解声明为:@interface
    • 内部定义成员,通常使用value表示
    • 可以指定成员的默认值,使用default定义
    • 如果自定义注解没有成员,表明是一个标识作用
  • 如果注解有成员,在使用注解时,需要指明成员的值

  • 自定义注解必须配上注解的信息处理流程(使用反射)才有意义

  • 自定义注解通常都会指明两个元注解:Retention、Target

JDK中的元注解

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

  • JDK5.0提供了4个标准的meta-annotation类型

    • Retention:只能用于修饰一个Annotation定义,用于指定该Annotation的生命周期:SOURCE、CLASS、RUNTIME
    • Target:用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰哪些程序元素。@Target 也包含一个名为value的成员变量
    • Documented:用于指定该被元Annotation修饰的Annotation类将被javadoc工具提取成文档。默认情况下,javadoc是不包括注解的
    • Inherited:被它修饰的Annotation将具有继承性

利用反射获取注解信息(在反射部分涉及)

  • 要求此注解的元注解Retention中声明的生命周期状态为RUNTIME

JDK8中注解的新特性

  • 可重复注解

    • 在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class
    • MyAnnotation的Target和Retention和MyAnnotations相同
  • 类型注解

    • ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如泛型声明)
    • ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中