Java 列舉(enum) 詳解7種常見的用法

gamebus發表於2021-09-09

JDK1.5引入了新的型別——列舉。在 Java 中它雖然算個“小”功能,卻給我的開發帶來了“大”方便。

大師兄我又加上自己的理解,來幫助各位理解一下。

用法一:常量

在JDK1.5 之前,我們定義常量都是: public static final.... 。現在好了,有了列舉,可以把相關的常量分組到一個列舉型別裡,而且列舉提供了比常量更多的方法。

Java程式碼

public enum Color {    RED, GREEN, BLANK, YELLOW  }

用法二:switch

JDK1.6之前的switch語句只支援int,char,enum型別,使用列舉,能讓我們的程式碼可讀性更強。

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;          }      }  }

用法三:向列舉中新增新方法

如果打算自定義自己的方法,那麼必須在enum例項序列的最後新增一個分號。而且 Java 要求必須先定義 enum 例項。

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; 
     }  }

用法四:覆蓋列舉的方法

下面給出一個toString()方法覆蓋的例子。

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.lang.Enum類。由於Java 不支援多繼承,所以列舉物件不能再繼承其他類。

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);
      }  }

用法六:使用介面組織列舉

**Java程式碼 **

public interface Food {      enum Coffee implements Food{ 
         BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
      }      enum Dessert implements Food{
          FRUIT, CAKE, GELATO 
     }  }
    /**     * 測試繼承介面的列舉的使用(by 大師兄 or 大溼胸。)     */    private static void testImplementsInterface() { 
       for (Food.DessertEnum dessertEnum : Food.DessertEnum.values()) { 
           System.out.print(dessertEnum + "  ");        } 
       System.out.println();        //我這地方這麼寫,是因為我在自己測試的時候,把這個coffee單獨到一個檔案去實現那個food介面,而不是在那個介面的內部。
        for (CoffeeEnum coffee : CoffeeEnum.values()) {
            System.out.print(coffee + "  "); 
       } 
       System.out.println();        //搞個實現介面,來組織列舉,簡單講,就是分類吧。如果大量使用列舉的話,這麼幹,在寫程式碼的時候,就很方便呼叫啦。
        //還有就是個“多型”的功能吧,        Food food = Food.DessertEnum.CAKE; 
       System.out.println(food);  
      food = CoffeeEnum.BLACK_COFFEE; 
       System.out.println(food); 
   }

圖片描述

執行結果

用法七:關於列舉集合的使用

java.util.EnumSet和java.util.EnumMap是兩個列舉集合。EnumSet保證集合中的元素不重複;EnumMap中的 key是enum型別,而value則可以是任意型別。關於這個兩個集合的使用就不在這裡贅述,可以參考JDK文件。

關於列舉的實現細節和原理請參考:

參考資料:《ThinkingInJava》第四版

http://softbeta.iteye.com/blog/1185573

我的這篇文章,因為是轉載的,可能基本就沒有變動,導致被某人踩了一腳。覺得不符合我大師兄的性格。下面我把自己的使用理解給整理一下。

也是因為因為當時剛剛開始學習吧。把平時自以為了解的東西都只是大概瞭解了一下,說到底,還是自以為了解了,其實轉眼就不知道什麼是什麼了。
出來學習,不習慣看程式碼怎麼能行呢?
下面是我自己的測試程式碼。

package com.lxk.enumTest; /** * Java列舉用法測試 * <p> * Created by lxk on 2016/12/15 */public class EnumTest {    public static void main(String[] args) {        forEnum();        useEnumInJava();    }     /**     * 迴圈列舉,輸出ordinal屬性;若列舉有內部屬性,則也輸出。(說的就是我定義的TYPE型別的列舉的typeName屬性)     */    private static void forEnum() {        for (SimpleEnum simpleEnum : SimpleEnum.values()) {            System.out.println(simpleEnum + "  ordinal  " + simpleEnum.ordinal());        }        System.out.println("------------------");        for (TYPE type : TYPE.values()) {            System.out.println("type = " + type + "    type.name = " + type.name() + "   typeName = " + type.getTypeName() + "   ordinal = " + type.ordinal());        }    }     /**     * 在Java程式碼使用列舉     */    private static void useEnumInJava() {        String typeName = "f5";        TYPE type = TYPE.fromTypeName(typeName);        if (TYPE.BALANCE.equals(type)) {            System.out.println("根據字串獲得的列舉型別例項跟列舉常量一致");        } else {            System.out.println("大師兄程式碼錯誤");        }     }     /**     * 季節列舉(不帶引數的列舉常量)這個是最簡單的列舉使用例項     * Ordinal 屬性,對應的就是排列順序,從0開始。     */    private enum SimpleEnum {        SPRING,        SUMMER,        AUTUMN,        WINTER    }      /**     * 常用型別(帶引數的列舉常量,這個只是在書上不常見,實際使用還是很多的,看懂這個,使用就不是問題啦。)     */    private enum TYPE {        FIREWALL("firewall"),        SECRET("secretMac"),        BALANCE("f5");         private String typeName;         TYPE(String typeName) {            this.typeName = typeName;        }         /**         * 根據型別的名稱,返回型別的列舉例項。         *         * @param typeName 型別名稱         */        public static TYPE fromTypeName(String typeName) {            for (TYPE type : TYPE.values()) {                if (type.getTypeName().equals(typeName)) {                    return type;                }            }            return null;        }         public String getTypeName() {            return this.typeName;        }    }}

然後是測試的結果圖:

圖片描述



作者:極夜_52b7
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4687/viewspace-2818673/,如需轉載,請註明出處,否則將追究法律責任。

相關文章