在Java中列舉或枚舉是一種特殊類型的類,它表示一組常數(不可變值),即一組不隨時間變化的固定值,因此所有可能的值在編譯時都是已知的,例如一周中的幾天、一年中的月份、顏色等。
由於枚舉是類別的一種類型,您可能會認為我們需要實例化它才能使用它,但是,這不是必需的,儘管它具有與普通類別相同的功能,例如屬性、方法、建構函數和即使實作接口,唯一的考慮是不能在枚舉中實現繼承的概念。它的主要目標是定義我們自己的資料類型(枚舉資料類型)。枚舉需要突出顯示的一些屬性是:
我們可以在類別內部或外部聲明枚舉,或在單獨的文件中聲明枚舉,但不能在方法內部聲明枚舉。聲明枚舉的語法如下:
enum NombreEnum { CONSTANTE1, CONSTANTE2, CONSTANTE3, ... }
依照慣例,枚舉的常數以大寫字母書寫。
通常,枚舉的第一行是常數的聲明,如有必要,後面是屬性、方法和建構函數。
// Enum declarado fuera de una clase enum Color { RED, GREEN, BLUE; } public class Main { public static void main(String[] args) {} }
// Enum declarado dentro de una clase public class Main { public static void main(String[] args) {} enum Color { RED, GREEN, BLUE; } }
要存取枚舉的任何常數,我們只需使用枚舉名稱,後面跟著句點和常數名稱。
Color color = Color.RED;
這可能不是那麼必要,但是如果我們需要取得常數宣告時的名稱,我們可以使用 name() 方法,儘管有時 toString() 方法會省略它以備我們需要更具描述性的東西。
System.out.println(Color.RED.name()); // RED System.out.println(Color.RED); // RED
我們可以使用values()方法來取得所有枚舉的常數,該方法傳回一個包含所有常數的陣列。
enum NombreEnum { CONSTANTE1, CONSTANTE2, CONSTANTE3, ... }
如果我們需要根據常數的名稱獲取常數,無論是因為我們接收它作為輸入,還是從檔案或資料庫取得它,我們都可以使用valueOf() 方法,我們只需要考慮這個方法區分大小寫,因此如果名稱與任何常數不匹配,則會拋出IllegalArgumentException。
// Enum declarado fuera de una clase enum Color { RED, GREEN, BLUE; } public class Main { public static void main(String[] args) {} }
之前,我們看到瞭如何以數組的形式獲取所有常數,所以你可能會想是否可以獲取常數的索引,答案是可以的,我們可以使用ordinal()方法來獲取常數的索引,就像在數組中索引從零開始一樣。
// Enum declarado dentro de una clase public class Main { public static void main(String[] args) {} enum Color { RED, GREEN, BLUE; } }
使用枚舉的優點之一是我們可以在 switch 控制結構中使用它,這使我們能夠簡化程式碼並使其更具可讀性。
Color color = Color.RED;
枚舉的每個常數都可以有自訂屬性,就像在普通類別中一樣,只需要考慮必須有一個初始化屬性的構造函數,這樣在載入常數時,就會隱式呼叫對應的構造函數。知道宣告中每個常數都是 enum 類型的對象,我們必須根據建構子傳遞屬性的值。
System.out.println(Color.RED.name()); // RED System.out.println(Color.RED); // RED
對於這個枚舉,我們有3 個常數,每個常數都有3 個屬性,名稱、層級和描述,此外還有一個所有常數通用的code 屬性,但它不需要在構造函數中初始化,因為它是一個常數值。每個屬性可以有不同的存取修飾符,這完全取決於我們的需求。
考慮到前面的範例,我們可以推斷,由於每個屬性都是 private 類型,我們需要一種方法來存取它們,因此我們可以為每個屬性聲明 getter 方法。
Color[] colors = Color.values(); for (Color color : colors) { System.out.println(color); }
我們也可以在枚舉中宣告實用方法,例如允許我們根據等級取得常數的方法。您只需考慮該方法必須是靜態的,因為我們無法實例化枚舉。
enum NombreEnum { CONSTANTE1, CONSTANTE2, CONSTANTE3, ... }
我們已經了解瞭如何在枚舉中實現方法,但是如果我們需要每個常數以不同的方式實現方法,我們可以聲明一個抽象方法,並且每個常數必須以自己的方式實現它,考慮到語法常數的聲明略有變化。例如,我們宣告一個抽象方法 showPermissions(),它透過控制台列印每個常數的權限。
// Enum declarado fuera de una clase enum Color { RED, GREEN, BLUE; } public class Main { public static void main(String[] args) {} }
枚舉可以實現一個或多個接口,與普通類別一樣,只需要用逗號分隔接口即可。
// Enum declarado dentro de una clase public class Main { public static void main(String[] args) {} enum Color { RED, GREEN, BLUE; } }
Java 提供了兩個類別來處理枚舉,EnumSet 和 EnumMap,它們分別比 HashSet 和 HashMap 類別更有效率,因為它們是為處理枚舉而設計的。 EnumSet 是唯一枚舉的元素的集合,而 EnumMap 是使用枚舉作為鍵的 Map 實作。
Color color = Color.RED;
我們已經了解了枚舉的不同特徵,現在讓我們來看一個使用所有這些特徵的範例。
System.out.println(Color.RED.name()); // RED System.out.println(Color.RED); // RED
枚舉是 Java 中非常有用的功能,因為它們允許我們定義自己的資料類型,這有助於我們使程式碼更具可讀性和可維護性,並允許我們更有效地使用常數。雖然它不是一個新功能,但了解它並知道如何使用它很重要,因為在許多情況下它可以幫助我們簡化我們的程式碼。
以上是Java 中的枚舉是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!