一、枚举类
当类的对象是有限个,且确定(各个属性值确定)的时候,可以使用枚举。
枚举类使用enum关键字定义,需要注意:
1️⃣定义enum时必须私有化构造器
2️⃣枚举对象必须在enum类的首行定义
3️⃣若枚举类对象有属性则这些属性必须声明为private final(不声明为final虽不会报语法等错误,而且可以通过setter重新给这些属性赋值,但是这样就失去了枚举的意义,枚举的对象就是要确定不变)
枚举类也可以实现接口,且有两种不同的实现方式:
①让枚举类直接实现此接口,则该类的所有枚举对象共享同一套抽象方法的实现;
示例1:枚举类直接实现接口方法
interface Info {//接口
void show(Season season);
}
enum Season implements Info {//枚举类并实现接口
SPRING("spring", "春天"),
SUMMER("summer", "夏天"),
AUTUMN("autumn", "秋天"),
WINTER("winter", "动天");//首行定义枚举对象
private final String name;//枚举对象属性声明为final的
private final String desc;
private Season(String name, String desc) {//私有化构造器
this.name = name;
this.desc = desc;
};
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public void show(Season season) {//实现接口方法
System.out.println("一年四季" + season.desc);//实现逻辑
}
}
②让类的每一个枚举对象分别实现接口的抽象方法,进而通过类的枚举对象调用被重写的抽象方法时,实现不同的业务逻辑
示例2:枚举对象实现接口方法,未自定义实现接口方法的枚举对象会使用枚举类的抽象方法实现,即枚举对象的接口方法实现优先于枚举类的接口方法实现
interface Info {
void show(Season season);
}
enum Season implements Info {
SPRING("spring", "春天") {
public void show(Season s) {
System.out.println("春天:" + s.getDesc());
}
},
SUMMER("summer", "夏天") {
public void show(Season s) {
System.out.println("春天:" + s.getDesc());
}
},
AUTUMN("autumn", "秋天") {
},
WINTER("winter", "动天") {
};
private final String name;
private final String desc;
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
};
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public void show(Season season) {
System.out.println("一年四季在于" + season.desc);
}
}
Tip
:可通过枚举来实现单例
经常使用的enum的方法有values()和valueOf(String name):
Season[] values = Season.values();//枚举类的所有对象
for(Season s : values)
System.out.println(s.getDesc());
Season valueOf = Season.valueOf("SPRING");//入参为枚举对象的名称,否則會報錯
System.out.println(valueOf.getDesc());
Season valueOf2 = Season.valueOf(Season.class, "SUMMER");
System.out.println(valueOf2.getDesc());
二、注解Annotation
元注解:对现有的注解进行注解的注解
@Retention:表明所修饰的注解的生命周期,SOURCE / CLASS(默认) / RUNTIME
RetentionPolicy.SOURCE:注解只在源码中显示,编译时即忽略
RetentionPolicy.CLASS:在编译时会记录在class文件中,但运行时会忽略
RetentionPolicy.RUNTIME:在编译时会记录在class文件中,运行时也会保留,只有定义为这种类型的注解才可以通过反射获取到
@Target:表明所修饰的注解可以用来修饰的类的结构,值有TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE
@Documented:表明所修饰的注解可以被javadoc解析
@Inherited:表明所修饰的注解是否具有继承性
示例:
@Target({ ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "java8";//注解的属性和默认值
}
//使用
public void show(@MyAnnotation(value = "str") String str) {
System.out.println(str);
}