8、枚举与注解

8、枚举类与注解

枚举类

枚举类的使用

类的对象只有有限个确定的。我们称此类为枚举类

当需要定义一组常量时,强烈建议使用枚举类。

若枚举类中只有一个对象,则可作为单例模式的实现方式。

如何定义枚举类:

  1. 自定义枚举类
    私有化类的构造器,保证不能在类的外部创建其对象
    在类的内部创建枚举类的实例。声明为:public static final(能够被外部访问)
    对象如果有实例变量,应该声明为private final,并在构造器中初始化
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 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.其他诉求:获取枚举类对象的属性
    public String getSeasonName(){return seasonName;}
    public String getSeasonDesc(){return seasonDesc;}
    public String toString(){};//toString用于打印
}
public static void main(){
    Season spring = Season.SPRING;
    Season summer = Season.SUMMER;
}
  1. enum关键字定义枚举类 --JDK5.0
    ​ 使用 enum 定义的枚举类默认继承了 java.lang.Enum类,因此不能再继承其他类
    ​ 必须在枚举类的第一行声明枚举类对象
    ​ 枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾)。列出的实例系统会自动添加 public static final 修饰
enum Season{
    //1.提供当前枚举类的对象,多个对象之间用 “,” 隔开,末尾对象 “;” 结束
    SPRING("春天","春风又绿江南岸"),
    SUMMER("夏天","映日荷花别样红"),
    AUTUMN("秋天","秋水共长天一色"),
    WINTER("冬天","窗含西岭千秋雪");

    //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;
    }
    //4.其他诉求:获取枚举类对象的属性
    public String getSeasonName(){return seasonName;}
    public String getSeasonDesc(){return seasonDesc;}
    public String toString(){};//枚举类自带,可以自己重写
}

Enum类中的常用方法:

values() 方法:返回枚举类型对象数组。该方法可以很方便地遍历所有的枚举值。
valueOf(String objName):返回枚举类中对象名是objName的对象。如不存在 会有运行时异常:IllegalArgumentException。
 toString():返回当前枚举类对象常量的名称

Season[] arr = Season.values();
Season summer = Season.valeOf("SUMMER");

使用enum关键字定义的枚举类实现接口的情况:

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

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

interface Info{
    void show();
}
enum Season implements Info{
    //枚举类对象分别实现 抽象方法
    SPRING("春天","春风又绿江南岸"){
        public void show(){sout("春天~");}
    },
    SUMMER("夏天","映日荷花别样红"){
        public void show(){sout("夏天~");}
    },
    AUTUMN("秋天","秋水共长天一色"){
        public void show(){sout("秋天~");}
    },
    WINTER("冬天","窗含西岭千秋雪"){
        public void show(){sout("冬天~");}
    };
    
    public void show(){
        sout("enum类中实现抽象方法"); //多个对象共用一个抽象方法
    }
}

注解

从 JDK 5.0 开始, Java 增加了对元数据(MetaData) 的支持, 也就是Annotation(注解)

注解概述

 注解 可以对程序作出解释,规范与约束程序

 Annotation 其实就是代码里的 特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理

 可以(像修饰符用于)使用在 包,类,构造器,方法,变量,参数 等,相当于给它们添加额外的信息-(通过反射访问)

框架 = 注解 + 反射 + 设计模式。

内置注解:

  • @Override 重写父类方法
  • @Deprecated (类,方法等) 已过时的,结构危险的
  • @SuppressWarnings(value = "all") 镇压警告(抑制编译器警告)

自定义注解:

 注解声明为:@interface
 内部定义成员,通常使用value表示
 可以指定成员的默认值,使用default定义
 若自定义注解没有成员,表明是一个标识作用。

@interface myAnnotaion{ 
    String value();   			    //只有一个参数时 --> 参数类型+value()
    String value() defalut "hello";   //指定成员默认值 --> default "xxx"
    String[] likes(); 			    //多个成员      --> 参数类型+变量名()
}

//使用注解:
@myAnnotation(name ="参数类型+参数名()",likes ={"芜","湖"} )
@myAnnotation2("直接写参数")
public static void main(String[] args) {
}
  • 若注解有成员,在使用注解时,需要指明成员的值

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

元注解:现有的注解进行解释 的注解)

  • @Retention:指定注解的生命周期:SOURCE\ CLASS(默认)\ RUNTIME

    ​ -- 只有声明为RUNTIME的注解,才能通过反射获取

  • @Target:能用于修饰哪些程序元素 (注解能用在哪 [构造器,方法,类,包,..] )

  • @Documented:把注解生成在Javadoc文档(默认不会生成)

  • @Inherited:子类可继承父类注解

JDK8新特性:
 可重复注解:@Repeatable
 可用类型注解:@Target的参数类型ElementType枚举值多了两个:
 ElementType.TYPE_PARAMETER :表示该注解能写在类型变量的声明语句中(如:泛型声明)。
 ElementType.TYPE_USE :表示该注解能写在使用类型的任何语句中。

posted @ 2022-04-11 21:05  simp1e1  阅读(41)  评论(0)    收藏  举报