JAVA 基礎知識點複習(十三)枚舉類

枚舉類定義

@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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章