Java枚舉值

枚舉類型定義了兩件事:

  • 枚舉常量名稱
  • 常量的順序

以下代碼聲明瞭一個名爲Level的公共枚舉類型,它具有四個枚舉常量:LOWMEDIUMHIGHURGENT

public enum Level {
    LOW,  MEDIUM,  HIGH, URGENT;
}

Level枚舉類型定義了四個枚舉常量。
級別枚舉類型的變量只能是以下四個值之一 - LOWMEDIUMHIGHURGENTnull。可以通過使用枚舉類型名稱作爲限定符和點符號來引用枚舉常量。
以下代碼將Level枚舉類型常量的值分配給一些局部變量:

Level low  = Level.LOW; 
Level medium = Level.MEDIUM; 
Level high  = Level.HIGH; 
Level urgent = Level.URGENT;

但是不能實例化枚舉類型。例如,以下代碼導致編譯時錯誤:

Level badAttempt   = new Level(); // A  compile-time error

枚舉順序號 枚舉類型爲其所有常量分配一個順序號,稱爲ordinal。順序值從零開始,在常數列表中從第一個到最後一個依次遞增1。第一個枚舉常量賦值爲0,第二個爲1,第三個爲2,依此類推。
分配給Level枚舉類型中聲明的常量的序數值是:將0分配給LOW1分配給MEDIUM2HIGH,以及3URGENT

每個枚舉常量都有一個與常量的標識符相同的名稱。例如,級別枚舉類型中的LOW常數的名稱爲「LOW」。可以分別使用name()ordinal()方法獲取枚舉常量的名稱和序號值。每個枚舉類型都有一個名爲values()的靜態方法,它按在枚舉主體中聲明的順序返回一個常量數組。
以下代碼打印在Level枚舉類型中聲明的所有枚舉常量的名稱和序號。

enum Level {
  LOW, MEDIUM, HIGH, URGENT;
}

public class Main {
  public static void main(String[] args) {
    for (Level s : Level.values()) {
      String name = s.name();
      int ordinal = s.ordinal();
      System.out.println(name + "(" + ordinal + ")");
    }
  }
}

上面的代碼生成以下結果。

LOW(0)
MEDIUM(1)
HIGH(2)
URGENT(3)

枚舉常量的反向查找

可以從名稱或位置獲得枚舉常量的引用。使用valueOf()方法就可以做到這點。

枚舉常量的反向查找區分大小寫。可以使用values()方法返回的數組,通過順序執行反向查找。values()方法返回的數組中的值的順序與枚舉常量的聲明順序相同。枚舉常量的序數從零開始。
以下代碼演示瞭如何反轉查找枚舉常量:

enum Level {
  LOW, MEDIUM, HIGH, URGENT;
}

public class Main {
  public static void main(String[] args) {
    Level low1 = Level.valueOf("LOW");
    // A reverse lookup using a name
    Level low2 = Level.values()[0];
    // A reverse lookup using an ordinal
    System.out.println(low1);
    System.out.println(low2);
    System.out.println(low1 == low2);

  }
}

執行上面的示例代碼,得到如下結果 -

LOW
LOW
true

枚舉常量的範圍

java.util.EnumSet集合類與枚舉類型的枚舉常量列表一起使用。
下面的代碼演示瞭如何使用EnumSet類來處理枚舉常量的範圍。

import java.util.EnumSet;

enum Level {
    LOW, MEDIUM, HIGH, URGENT;
}

public class Main {
    public static void main(String[] args) {
        EnumSet<Level> allLevels = EnumSet.allOf(Level.class);
        print(allLevels);

        EnumSet<Level> l = EnumSet.range(Level.LOW, Level.URGENT);
        print(l);

    }

    public static void print(EnumSet<Level> levels) {
        for (Level d : levels) {
            System.out.println(d + "  ");
        }
    }
}

執行上面的示例代碼,得到如下結果 -

LOW  
MEDIUM  
HIGH  
URGENT  
LOW  
MEDIUM  
HIGH  
URGENT