Java 中的枚举类和注解
Java 中的枚举类和注解
1. 枚举类的使用
当需要定义一组常量时,强烈建议使用枚举类。要求类的对象是有限个且是确定的。例如:星期、性别、季节、支付方式...
如果枚举类中只有一个对象,则可以作为单例模式的实现方式。
如何自定义枚举类(JDK5.0之前)
- 声明枚举类对象的属性。
- 创建私有化构造器。
- 定义枚举类对象。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.summer.java; /** * @Author 安宁侯 * @create 2021-03-08 6:27 */ public class MyEnum { public static void main(String[] args) { Season season1 = Season.SPRING; System.out.println(season1); } } //自定义枚举类 class Season{ //1.声明season对象的属性 private final String name; private final String desc; //2.私有化构造器 private Season(String name,String desc){ //3.为属性赋值 this.name=name; this.desc=desc; } //4.定义枚举类的对象: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("冬天","寒冷"); public String getName() { return name; } public String getDesc() { return desc; } @Override public String toString() { return "Season{" + "name='" + name + '\'' + ", desc='" + desc + '\'' + '}'; } }
如何使用关键字enum自定义枚举类(JDK5.0)
- 声明枚举类对象。
- 声明属性。
- 创建私有化构造器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.summer.java; /** * @Author 安宁侯 * @create 2021-03-08 6:46 */ public class MyEnum1 { public static void main(String[] args) { MySeason spring = MySeason.SPRING; System.out.println(spring); } } /* 使用enum定义枚举类时,默认继承于java.lang.enum */ enum MySeason{ //1.提供当前枚举类的对象,多个对象值之间用逗号隔开,最后一个用分号结尾 SPRING("春天","温暖"), SUMMER("..",".."), AUTUMN("..",".."), WINTER("..",".."); private final String name; private final String desc; //2.私有化构造器 private MySeason(String name,String desc){ //3.为属性赋值 this.name=name; this.desc=desc; } @Override public String toString() { return "MySeason{" + "name='" + name + '\'' + ", desc='" + desc + '\'' + '}'; } }
Enum类的主要方法
values():返回枚举类型的对象数组。可以很方便的获取到所有的枚举值
valueOf(String str):把一个字符串转成对应的枚举类对象。(根据指定名找到枚举类对象,返回该对象的对象名。如果找不到,则会报异常)
toString():返回当前枚举类对象的名称
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class MyEnum1 {
public static void main(String[] args) {
MySeason spring = MySeason.SPRING;
//toString
System.out.println(spring);
//values
for (int i = 0; i < MySeason.values().length; i++) {
System.out.println(MySeason.values()[i]);
}
//valueOf
System.out.println(MySeason.valueOf("WINTER"));
}
}
实现接口的枚举类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//valueOf
System.out.println(MySeason.valueOf("WINTER"));
MySeason.AUTUMN.show();
}
}
/*
使用enum定义枚举类时,默认继承于java.lang.enum
*/
interface Info{
void show();
}
enum MySeason implements Info{
//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("这是冬天");
}
};
private final String name;
private final String desc;
//2.私有化构造器
private MySeason(String name,String desc){
//3.为属性赋值
this.name=name;
this.desc=desc;
}
}
2. 注解的使用
常见的annotation示例
示例一:生成文档时的相关注解
@author:开发者的名称,多个开发者之间用逗号隔开
@version:当前模块的版本
@see:参考转向,也就是相关主题
@since:从哪个版本开始增加的
@param:对方法中某个参数的说明,如果没有参数就不能写
@return:对返回值的说明,如果没有返回值就不能写
@exception:对异常的说明,如果异常没有经过throws显示抛出就不能写
示例二:在编译时进行格式检查(JDK中内置的三个基本注解)
@Override:限定重写父类方法,该注解只能用于方法
@Deprecated:表明所修饰的元素(类、方法)已经过时
@SuppressWarnings:抑制编译器警告
示例三:跟踪代码的依赖性,实现替代配置文件的功能。例如:@WebServlet、@Transactional、@Test...
自定义Annotation
- 注解声明为@interface
- 内部定义成员,通常使用value表示
- 可以指定成员的默认值,使用default定义
- 如果自定义注解没有成员,表明是一个标识作用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//@MyAnnotation(value = "hello")//使用注解 @MyAnnotation//此时使用的是默认值hello public @interface MyAnnotation {//1.声明注解类 String value() default "hello"; }
自定义注解必须配上自定义注解流程(使用反射)才有意义。通常都会指定Retention和Target两个注解
JDk中的4种元注解
元注解:用来修饰其他注解的注解。JDK5.0提供了四种mate-annotation。
Retention:只能用来修饰一个annotation定义,用于指定该annotation的生命周期,@Retention包含了一个RetentionPolicy类型的成员变量,使用@Retention注解时必须为该value成员变量指定值。
RetentionPolicy的值:
RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种这种策略的注释。
RetentionPolicy.CALSS:在class文件中有效(即class保留),当运行Java程序时,JVM不会保留注释。该值是RetentionPolicy的默认值
RetentionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行Java程序时,JVM会保留注释。程序可以通过反射获取该注释。
Target:只能用来修饰一个annotation定义,用于指定该annotation能用来修饰哪些程序元素。@Target也包含了一个名为value的成员变量。
TYPE:可以用来修饰类
FIELD:可以用来修饰属性
METHOD:可以用来修饰方法
PARAMETER:可以用来修饰形参
CONSTRUCTOR:可以用来修饰构造器
LOCAL_VARIABLE:可以用来修饰局部变量
Documented:用于指定被该Annotation修饰的annotation类可以被javadoc工具提取成文档。默认情况下,javadoc是不包含注解的。
定义为Documented的注解必须设置Retention的值为RUNTIME。
Inherited:被该注解修饰的annotation将具有继承性。如果某个类使用了被Inherited修饰的注解,其子类将自动拥有该注解
JDK8中的注解新特性
可重复注解:可重复定义多个的注解
在自定义的Myannotation上使用注解@Repeatable,成员值为MyAnnotation.class。
MyAnnotation的Target和Retention与MyAnnotation相同。
类型注解:
ElementType.TYPE_PARAMETER:表示该注解能写在类型变量的声明语句中。
ElementType.TYPE_USE:表示该注解能写在使用类型的任何语句中。