今天在學習的過程中遇到了枚舉這個知識點。之前一直都知道這個“名字”,只是對其中的含義和相關用法都並不瞭解。所以決定粗淺學習一下。搜索了一下,這方面的資料不少。其中主要參考的博文有兩篇,附上鍊接:鏈接1鏈接2
枚舉類型介紹
- 定義:枚舉類型(enum type)是指由一組固定的常量組成合法的類型。Java中由關鍵字enum來定義一個枚舉類型。例子如下:
public enum Color{ RED,GREEN,BLUE,YELLOW }
- 定義:枚舉類型(enum type)是指由一組固定的常量組成合法的類型。Java中由關鍵字enum來定義一個枚舉類型。例子如下:
2.枚舉類型被用來將一組類似的值包含到一種類型當中。而這種枚舉類型的名稱則會被定成獨一無二的類型描述符,在這一點上和常量的定義相似。不過相比較常量類型,枚舉類型可以爲申明的變量提供更大的取值範圍。舉個例子:在我們平時使用switch的時候,switch的值只能是簡單類型如int、byte、short、char。而有了枚舉類型之後,就可以直接使用對象。代碼例子如下:
// 定義一週七天的枚舉類型
public enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun }
// 讀取當天的信息
WeekDayEnum today = readToday();
// 根據日期來選擇進行活動
switch(today) {
Mon: do something; break;
Tue: do something; break;
Wed: do something; break;
Thu: do something; break;
Fri: do something; break;
Sat: play sports game; break;
Sun: have a rest; break;
}
對於這些枚舉的日期,JVM 都會在運行期構造成出一個簡單的對象實例一一對應。這些對象都有唯一的 identity,類似整形數值一樣,switch 語句就根據此來進行執行跳轉。
爲什麼引入Enum類型
在Java語言沒有引入枚舉類型之前,表示枚舉類型的常用模式是聲明一組具有int常量。通常利用public final static
方法定義相關代碼。例子如下:
“`java
Public static class RainbowColor {
// 紅橙黃綠青藍紫七種顏色的常量定義
public static final int RED = 0;
public static final int ORANGE = 1;
public static final int YELLOW = 2;
public static final int GREEN = 3;
public static final int CYAN = 4;
public static final int BLUE = 5;
public static final int PURPLE = 6;
}
```
使用的時候,我們可以在程序中直接引用這些常量。但是這種模式有什麼問題呢?大家都用了那麼久了,爲什麼還要引入枚舉類型(enum type)(從Java1.5開始引入枚舉類型)呢?要從以下幾個方面說起。
- 安全性(類型不安全)
由於顏色常量的對應值是整數形,所以程序執行過程中很有可能給顏色變量傳入一個任意的整數值,導致出現錯誤。
- 一致性差
因爲整形枚舉屬於編譯期常量,所以編譯過程完成後,所有客戶端和服務器端引用的地方,會直接將整數值寫入。這樣,當你修改舊的枚舉整數值後或者增加新的枚舉值後,所有引用地方代碼都需要重新編譯,否則運行時刻就會出現錯誤。 可讀性差
使用枚舉的大多數場合,我都需要方便得到枚舉類型的字符串表達式。如果將int枚舉常量打印出來,我們所見到的就是一組數字,這是沒什麼太大的用處。我們可能會想到使用String常量代替int常量。雖然它爲這些常量提供了可打印的字符串,但是它會導致性能問題,因爲它依賴於字符串的比較操作,所以這種模式也是我們不期望的。因此,從類型安全性和程序可讀性兩方面考慮,int和String枚舉模式的缺點就顯露出來了。
用法大總結
*那麼什麼時候應該使用枚舉呢?每當需要一組固定的常量的時候,如一週的天數、一年四季等。或者是在我們編譯前就知道其包含的所有值得集合。Java 1.5的枚舉類型能滿足絕大多數程序員的要求的,它的簡明,易用的特點是很突出的。
用法一:常量
java
public enum Color {
RED, GREEN, BLANK, YELLOW
}用法二:switch
```java enum Signal { GREEN, YELLOW, RED
}
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
“`用法三:向枚舉中添加新方法
```java public enum Color { RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4); // 成員變量 private String name; private int index; // 構造方法 private Color(String name, int index) { this.name = name; this.index = index; } // 普通方法 public static String getName(int index) { for (Color c : Color.values()) { if (c.getIndex() == index) { return c.name; } } return null; } // get set 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } } ```
- 用法四:覆蓋枚舉的方法
java
public enum Color {
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);
// 成員變量
private String name;
private int index;
// 構造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//覆蓋方法
@Override
public String toString() {
return this.index+"_"+this.name;
}
}
- 用法五:實現接口
java
public interface Behaviour {
void print();
String getInfo();
}
public enum Color implements Behaviour{
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);
// 成員變量
private String name;
private int index;
// 構造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//接口方法
@Override
public String getInfo() {
return this.name;
}
//接口方法
@Override
public void print() {
System.out.println(this.index+":"+this.name);
}
}
- 用法六:使用接口組織枚舉
public interface Food { enum Coffee implements Food{ BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO } enum Dessert implements Food{ FRUIT, CAKE, GELATO } }
全文結束,希望對大家有所幫助。