Java 枚举&注解
枚举类
如何自定义枚举类
JDK1.5 之前需要自定义枚举类
JDK 1.5 新增的 enum 关键字用于定义枚举类
若枚举只有一个成员, 则可以作为一种单例模式的实现方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | //枚举类 class Season{ //1.提供类的属性,声明为private final private final String seasonName; private final String seasonDesc; //2.声明为final的属性,在构造器中初始化。 private Season(String seasonName,String seasonDesc){ this .seasonName = seasonName; this .seasonDesc = seasonDesc; } //3.通过公共的方法来调用属性 public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } //4.创建枚举类的对象:将类的对象声明public static final public static final Season SPRING = new Season( "spring" , "春暖花开" ); public static final Season SUMMER = new Season( "summer" , "夏日炎炎" ); public static final Season AUTUMN = new Season( "autumn" , "秋高气爽" ); public static final Season WINTER = new Season( "winter" , "白雪皑皑" ); @Override public String toString() { return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]" ; } public void show(){ System.out.println( "这是一个季节" ); } } |
Enum 枚举类
必须在枚举类的第一行声明枚举类对象。
枚举类和普通类的区别:
使用 enum 定义的枚举类默认继承了 java.lang.Enum 类
枚举类的构造器只能使用 private 访问控制符
枚举类的所有实例必须在枚举类中显式列出 (, 分隔 ; 结尾). 列出的实例系统会自动添加 public static final 修饰
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | interface Info{ void show(); } //枚举类 enum Season1 implements Info{ SPRING( "spring" , "春暖花开" ){ public void show(){ System.out.println( "春天在哪里?" ); } }, SUMMER( "summer" , "夏日炎炎" ){ public void show(){ System.out.println( "生如夏花" ); } }, AUTUMN( "autumn" , "秋高气爽" ){ public void show(){ System.out.println( "秋天是用来分手的季节" ); } }, WINTER( "winter" , "白雪皑皑" ){ public void show(){ System.out.println( "冬天里的一把火" ); } }; private final String seasonName; private final String seasonDesc; private Season1(String seasonName,String seasonDesc){ this .seasonName = seasonName; this .seasonDesc = seasonDesc; } public String getSeasonName() { return seasonName; } public String getSeasonDesc() { return seasonDesc; } @Override public String toString() { return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]" ; } } |
枚举类的主要方法:
values() 方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常。
如何让枚举类实现接口: 可以让不同的枚举类的对象调用被重写的抽象方法,执行的效果不同。(相当于让每个对象重写抽象方法)
注解 Annotation
Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理. 通过使用 Annotation, 程序员可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息.
基本的 Annotation
@Override: 限定重写父类方法, 该注释只能用于方法
@Deprecated: 用于表示某个程序元素 (类, 方法等) 已过时
@SuppressWarnings: 抑制编译器警告
自定义 Annotation
定义新的 Annotation 类型使用 @interface 关键字
Annotation 的成员变量在 Annotation 定义中以无参数方法的形式来声明. 其方法名和返回值定义了该成员的名字和类型.
可以在定义 Annotation 的成员变量时为其指定初始值, 指定成员变量的初始值可使用 default 关键字
1 2 3 | public @interface MyAnnotation{ String name() default “atguigu"; } |
没有成员定义的 Annotation 称为标记; 包含成员变量的 Annotation 称为元数据 Annotation
元注解
JDK 的元 Annotation 用于修饰其他 Annotation 定义
@Retention: 只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留多长时间, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值:
RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释
RetentionPolicy.CLASS: 编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解。 这是默认值
RetentionPolicy.RUNTIME: 编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注释. 程序可以通过反射获取该注释
@Target: 用于修饰 Annotation 定义, 用于指定被修饰的 Annotation 能用于修饰哪些程序元素. @Target 也包含一个名为 value 的成员变量.
@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.
定义为 Documented 的注解必须设置 Retention 值为 RUNTIME。
@Inherited: 被它修饰的 Annotation 将具有继承性. 如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解
实际应用中,使用较少