Java列舉型別


列舉型別是什麼?

列舉型別建立常數的有序列表作為型別。它以特定順序指定常數。在列舉型別中定義的常數是該列舉型別的範例。

語法

使用關鍵字enum定義列舉型別,語法以下:

<access-modifier> enum <enum-type-name>  {
    // List of  comma  separated names of  enum constants
}

<access-modifiers>與類的存取修飾符相同:publicprivateprotectedpackage-level

<enum-type-name>是有效的Java識別符號。列舉型別的主體放在大括號中,名稱後面。主體可以有逗號分隔的常數和其他元素的列表,例如範例變數,方法等。
在大多數情況下,列舉體只包括常數。

範例

以下程式碼宣告了一個名為Gender的列舉型別,它宣告了兩個常數:MALEFEMALE

public enum Gender  {
    MALE,  FEMALE;  // The semi-colon is optional
}

將列舉常數命名為大寫是一種慣例。以下程式碼宣告了一個名為Level的公共列舉型別,它具有四個列舉常數:LOWMEDIUMHIGHURGENT

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

可以從應用程式中的任何位置存取公共列舉型別。公共列舉型別保留在具有列舉型別名稱的檔案中。 級別列舉將儲存在名為Level.java的檔案中。
需要在包中放置列舉型別,使用import語句來匯入列舉型別。

列舉變數

宣告列舉型別的變數,就像宣告類的變數一樣。以下程式碼宣告Level列舉型別的errorLevel變數,如下程式碼所示 -

Level errorLevel;

可以為列舉型別變數分配null值,如下所示:

Level defectLevel = null;

在 switch 語句中使用列舉型別

可以在switch語句中使用列舉型別。當switch表示式是列舉型別時,所有case標籤必須是同一列舉型別的列舉常數。

enum Direction {
  East, South, West, North
}

public class Main {
  public static void main(String args[]) {
    Direction dir = Direction.South;
    switch (dir) {
    case South:
      System.out.println("south");
      break;
    case East:
      System.out.println("East");
      break;
    case West:
      System.out.println("West");
      break;
    case North:
      System.out.println("North.");
      break;
    }
  }
}

上面的程式碼生成以下結果。

south

巢狀列舉型別

可以在類,介面或另一個列舉型別中有一個巢狀的列舉型別宣告。巢狀列舉型別是隱式靜態的。 因為列舉型別總是靜態的,所以不能在方法體內宣告一個區域性列舉型別。
對於巢狀列舉型別,可以使用任何存取修飾符(publicprivateprotectedpackage)級別。

以下程式碼顯示了如何在Person類中宣告名為Gender的巢狀公共列舉型別。

class Person {
  public enum Gender {
    MALE, FEMALE
  }
}

public class Main {
  public static void main(String[] args) {
    Person.Gender m = Person.Gender.MALE;
    Person.Gender f = Person.Gender.FEMALE;
    System.out.println(m);
    System.out.println(f);
  }
}

Person.Gender列舉型別可以從應用程式中的任何位置存取,因為它已被宣告為public。也可以通過使用靜態匯入匯入列舉常數來使用列舉常數的簡單名稱。

import static  com.java2s.enums.Person.Gender.*;

列舉型別實現介面

列舉型別可以實現介面。列舉型別實現介面的規則與實現介面的類的規則相同。
下面的程式碼演示了如何讓列舉型別實現一個介面。

interface Command {
  void execute();
}

enum Level implements Command {
  LOW {
    public void execute() {
      System.out.println("Low...");
    }
  },
  HIGH {
    public void execute() {
      System.out.println("HIGH...");
    }
  };
  public abstract void execute();
}

public class Main {
  public static void main(String... args) {
    for (Command cmd : Level.values()) {
      cmd.execute();
    }
  }
}

上面的程式碼生成以下結果。

Low...
HIGH...