8、枚举与注解
8、枚举类与注解
枚举类
枚举类的使用
类的对象只有有限个,确定的。我们称此类为枚举类;
当需要定义一组常量时,强烈建议使用枚举类。
若枚举类中只有一个对象,则可作为单例模式的实现方式。
如何定义枚举类:
- 自定义枚举类
私有化类的构造器,保证不能在类的外部创建其对象
在类的内部创建枚举类的实例。声明为: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; }
- 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 :表示该注解能写在使用类型的任何语句中。

浙公网安备 33010602011771号