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