Java中枚舉類型Enum的用法介紹

今天在學習的過程中遇到了枚舉這個知識點。之前一直都知道這個“名字”,只是對其中的含義和相關用法都並不瞭解。所以決定粗淺學習一下。搜索了一下,這方面的資料不少。其中主要參考的博文有兩篇,附上鍊接:鏈接1鏈接2

枚舉類型介紹

    1. 定義:枚舉類型(enum type)是指由一組固定的常量組成合法的類型。Java中由關鍵字enum來定義一個枚舉類型。例子如下:
      public enum Color{
          RED,GREEN,BLUE,YELLOW
      }
  • 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的枚舉類型能滿足絕大多數程序員的要求的,它的簡明,易用的特點是很突出的。

    1. 用法一:常量
      java
      public enum Color {
      RED, GREEN, BLANK, YELLOW
      }

    2. 用法二: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;
      }
      }
      }
      “`

    3. 用法三:向枚舉中添加新方法

      ```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;  
          }  
      }  
      ```  
      
    4. 用法四:覆蓋枚舉的方法
      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;
      }
      }
    5. 用法五:實現接口
      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);
      }
      }
    6. 用法六:使用接口組織枚舉
          public interface Food {  
          enum Coffee implements Food{  
              BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
          }  
          enum Dessert implements Food{  
              FRUIT, CAKE, GELATO  
          }  
      }

    全文結束,希望對大家有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章