Java - 枚舉構造器

你好,未來的Java巫師們!今天,我們將踏上一段令人興奮的旅程,深入Java枚舉及其構造器的世界。如果你是编程新手,不必擔心;我會一步步引導你完成這次冒險,就像我多年教學中為無數學生所做的那樣。所以,拿起你最喜歡的飲料,舒服地坐下,讓我們一起深入探險!

Java - Enum Constructor

什麼是枚舉?

在我們討論枚舉構造器之前,先來了解一下枚舉是什麼。你可以將枚舉(enumeration的簡稱)視為一種特殊的類別,它代表了一組常量。就像一個預定義的值列表,這些值不會改變。

想象一下,你正在創建一個具有不同難度等級的遊戲。你可以使用枚舉來表示這些等級:

public enum DifficultyLevel {
EASY,
MEDIUM,
HARD
}

在這裡,EASYMEDIUMHARD是我們DifficultyLevel枚舉的常量(或成員)。

了解枚舉構造器

現在我們知道了枚舉是什麼,來談談它的構造器。就像普通類一樣,枚舉也可以有構造器!這些構造器允許我們將額外的數據與每個枚舉常量相關聯。

基本枚舉構造器

讓我們通過為每個等級添加描述來增強我們的DifficultyLevel枚舉:

public enum DifficultyLevel {
EASY("適合初學者"),
MEDIUM("適合中級玩家"),
HARD("適合專家玩家");

private final String description;

DifficultyLevel(String description) {
this.description = description;
}

public String getDescription() {
return description;
}
}

在這個例子中:

  1. 我們為每個枚舉常量添加了一個String參數。
  2. 我們創建了一個私有的description字段。
  3. 我們定義了一個構造器,該構造器接受一個String參數並將其分配給description
  4. 我們添加了一個getter方法來訪問描述。

現在,讓我們看看如何使用這個枚舉:

public class Game {
public static void main(String[] args) {
DifficultyLevel level = DifficultyLevel.MEDIUM;
System.out.println("選擇的難度:" + level);
System.out.println("描述:" + level.getDescription());
}
}

輸出:

選擇的難度:MEDIUM
描述:適合中級玩家

這不酷嗎?我們為枚舉常量添加了額外的信息!

使用枚舉構造器

當你想將數據與每個枚舉常量相關聯時,枚舉構造器非常有用。以下是一些常見的用例:

  1. 添加描述:正如我們在DifficultyLevel例子中看到的。
  2. 分配數值:對於排序或計算是很有用的。
  3. 鏈接到其他對象:你可以將每個枚舉常量與另一個類的實例相關聯。

讓我們再看一個例子,我們為枚舉常量分配數值:

public enum Planet {
MERCURY(3.303e+23, 2.4397e6),
VENUS(4.869e+24, 6.0518e6),
EARTH(5.976e+24, 6.37814e6);

private final double mass;   // 以千克為單位
private final double radius; // 以米為單位

Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}

public double getMass() { return mass; }
public double getRadius() { return radius; }

// 環球引力常數(m³ kg⁻¹ s⁻²)
public static final double G = 6.67300E-11;

public double surfaceGravity() {
return G * mass / (radius * radius);
}
}

在這個例子中,我們創建了一個Planet枚舉,每個常量都有質量和半徑。現在我們可以計算每個行星的表面重力:

public class SolarSystem {
public static void main(String[] args) {
for (Planet p : Planet.values()) {
System.out.printf("在%s上的表面重力是%.2f m/s²%n",
p, p.surfaceGravity());
}
}
}

輸出:

在MERCURY上的表面重力是3.70 m/s²
在VENUS上的表面重力是8.87 m/s²
在EARTH上的表面重力是9.80 m/s²

枚舉構造器的範圍

現在,讓我們談談枚舉構造器的範圍。以下是需要記住的一個關鍵點:

枚舉構造器總是私有的,即使你沒有明確聲明它們為私有。

這意味著你無法在枚舉定義之外創建枚舉類型的新的實例。Java這樣做是為了確保枚舉中的常量集合是固定的,並且在運行時不能更改。

帶有私有構造器的枚舉

儘管枚舉構造器是隱式私有的,但明確聲明它們為私有是一個好習慣,這樣可以增加清晰度:

public enum Season {
SPRING("溫暖"),
SUMMER("炎熱"),
AUTUMN("涼爽"),
WINTER("寒冷");

private final String temperature;

private Season(String temperature) {
this.temperature = temperature;
}

public String getTemperature() {
return temperature;
}
}

帶有包私有構造器的枚舉

雖然枚舉構造器不能是公有的,但它們可以是包私有的(默認訪問修飾符)。這允許同一包中的其他類看到構造器:

enum DatabaseConnection {
INSTANCE;

DatabaseConnection() {
// 初始化數據庫連接
}

void connect() {
System.out.println("連接到數據庫");
}
}

在這個例子中,我們正在使用枚舉來實現數據庫連接的單例模式。

結論

恭喜你!你剛剛解鎖了Java中枚舉構造器的力量。請記住,枚舉不僅僅是常量的簡單列表;有了構造器,它們變成了創建類型安全、數據豐富對象的強大工具。

在你繼續Java的旅程中,你會發現還有許多令人興奮的功能等待你去探索。繼續編程,繼續學習,最重要的是,玩得開心!誰知道呢,也許有一天你會成為教導下一代程序員Java的人。

在我們結束之前,讓我們總結一下所有枚舉類型都有的關鍵方法:

方法 描述
values() 返回一個包含所有枚舉常量的數組
valueOf(String name) 返回具有指定名稱的枚舉常量
name() 精確返回此枚舉常量的名稱,正如聲明的那樣
ordinal() 返回此枚舉常量的序數(在其枚舉聲明中的位置,其中初始常量被分配一個序數零)
compareTo(E o) 將此枚舉與指定的對象進行排序比較
equals(Object other) 如果指定的對象與此枚舉常量相等,則返回true
hashCode() 返回此枚舉常量的哈希碼

請記住,熟練才能精通。所以,繼續創建你自己的枚舉,實驗構造器,看看你能夠建造出什麼驚人的東西。編程愉快!

Credits: Image by storyset