枚舉類定義
@Getter
public enum WeekEnum {
MONDAY(1, "星期一"),
TUESDAY(2, "星期二"),
WEDNESDAY(3, "星期三"),
THURSDAY(4, "星期四"),
FRIDAY(5, "星期五"),
SATURDAY(6, "星期六"),
SUNDAY(7, "星期日");
private int value;
private String name;
WeekEnum(int value, String name) {
this.value = value;
this.name = name;
}
}
反編譯class
public final class com.example.demo.test.WeekEnum extends java.lang.Enum<com.example.demo.test.WeekEnum> {
public static final com.example.demo.test.WeekEnum MONDAY;
public static final com.example.demo.test.WeekEnum TUESDAY;
public static final com.example.demo.test.WeekEnum WEDNESDAY;
public static final com.example.demo.test.WeekEnum THURSDAY;
public static final com.example.demo.test.WeekEnum FRIDAY;
public static final com.example.demo.test.WeekEnum SATURDAY;
public static final com.example.demo.test.WeekEnum SUNDAY;
public static com.example.demo.test.WeekEnum[] values();
public static com.example.demo.test.WeekEnum valueOf(java.lang.String);
enum
關鍵字其實是生成一個被final修飾並繼承了java.lang.Enum(抽象類)的類,同時還生成了7個WeekEnum類型的實例對象,還生成了兩個靜態方法values()和valueOf()
常見方法
// name() 返回此枚舉常量的名稱,在其枚舉聲明中對其進行聲明
String name = WeekEnum.FRIDAY.name();
// ordinal() 返回枚舉常量的序數(它在枚舉聲明中的位置,其中初始常量序數爲零)
int ordinal = WeekEnum.FRIDAY.ordinal();
// compareTo() 比較此枚舉與指定對象的順序,內部是通過ordinal()方法進行的比較
int i = WeekEnum.FRIDAY.compareTo(WeekEnum.SATURDAY);
// toString() 返回枚舉常量的名稱,它包含在聲明中,與name()基本一致
String s = WeekEnum.FRIDAY.toString();
// equals() 當指定對象等於此枚舉常量時,返回 true
boolean equals = WeekEnum.FRIDAY.equals(WeekEnum.FRIDAY);
// getDeclaringClass() 返回與此枚舉常量的枚舉類型相對應的 Class 對象
Class<WeekEnum> declaringClass = WeekEnum.FRIDAY.getDeclaringClass();
// Enum.valueOf() 返回帶指定名稱的指定枚舉類型的枚舉常量
WeekEnum friday = Enum.valueOf(WeekEnum.class, "FRIDAY");
自動生成的兩個方法
// values() 獲取枚舉類中的所有變量,並作爲數組返回
WeekEnum[] values = WeekEnum.values();
// valueOf() 封裝了Enum.valueOf(),簡化成一個參數
WeekEnum friday1 = WeekEnum.valueOf("FRIDAY");
枚舉類在switch中
如果switch後是枚舉類,則case後面必須要是枚舉枚舉常量的非限定名稱
switch (weekEnum){
case WeekEnum.MONDAY: // 編譯異常 An enum switch case label must be the unqualified name of an enumeration constant
case TUESDAY: // 正確寫法
實際應用
(一)外部直接通過value獲取name
public static Map<Integer, WeekEnum> enumMap;
static {
enumMap = Arrays.stream(WeekEnum.values())
.collect(Collectors.toMap(WeekEnum::getValue, o -> o));
}
// 外部直接通過value獲取name
public static String getNameByValue(int value) {
WeekEnum weekEnum = enumMap.get(value);
return weekEnum != null ? weekEnum.getName() : "";
}
public static void main(String[] args) {
System.out.println(WeekEnum.getNameByValue(5));
}
(二)通過抽象方法擴展枚舉類
@Getter
public enum WeekEnum{
MONDAY(1, "星期一"){
@Override
public void getValueAndName() {
System.out.println(this.getValue() + this.getName());
}
},
TUESDAY(2, "星期二"){
@Override
public void getValueAndName() {
System.out.println(this.getValue() + this.getName());
}
};
public abstract void join();
private int value;
private String name;
WeekEnum(int value, String name) {
this.value = value;
this.name = name;
}
public static void main(String[] args) {
WeekEnum.WEDNESDAY.getValueAndName();
}
}