枚举类的使用
- 类的对象只有有限个,确定的。称此类为枚举类
- 当需要定义一组常量时,强烈建议使用枚举类
- 如果枚举类中只有一个对象,则可以作为单例模式的实现方式
如何自定义枚举类
-
方式一: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 表示该注解能写在使用类型的任何语句中