首頁 > Java > java教程 > Java 中的枚舉是什麼?

Java 中的枚舉是什麼?

Mary-Kate Olsen
發布: 2025-01-03 00:17:08
原創
163 人瀏覽過

¿Qué son los enums en Java?

在Java中列舉或枚舉是一種特殊類型的類,它表示一組常數(不可變值),即一組不隨時間變化的固定值,因此所有可能的值在編譯時都是已知的,例如一周中的幾天、一年中的月份、顏色等。

由於枚舉是類別的一種類型,您可能會認為我們需要實例化它才能使用它,但是,這不是必需的,儘管它具有與普通類別相同的功能,例如屬性、方法、建構函數和即使實作接口,唯一的考慮是不能在枚舉中實現繼承的概念。它的主要目標是定義我們自己的資料類型(枚舉資料類型)。枚舉需要突出顯示的一些屬性是:

  • 每個枚舉在內部都使用類別類型實作為一個類別。
  • 枚舉的每個常數代表一個枚舉類型的物件。
  • 所有枚舉都隱式擴展 java.lang.Enum,因為類別只能從父類別擴展,枚舉不能從另一個類別擴展。
  • 枚舉中的每個常數都隱含屬於 public static final 型態。
  • 它們可以用來控制結構,例如開關。
  • main() 方法可以在枚舉內宣告。
  • 重寫 toString() 方法以傳回常數的名稱。

列舉的聲明

我們可以在類別內部或外部聲明枚舉,或在單獨的文件中聲明枚舉,但不能在方法內部聲明枚舉。聲明枚舉的語法如下:

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;
    }
}
登入後複製
登入後複製
登入後複製

EnumSet 和 EnumMap

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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板