Java 列舉(enum) 詳解7種常見的用法
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java enum列舉類詳解 列舉的常見用法Java
- Java 列舉7常見種用法Java
- 【轉】Java 列舉7常見種用法Java
- Java列舉的七種常見用法Java
- Java 列舉 enum 詳解Java
- java enum(列舉)使用詳解 + 總結Java
- Java列舉型別enum的詳解及使用Java型別
- Java 列舉(enum)Java
- Java - Enum 列舉型別Java型別
- Java —— 列舉類(enum 類)Java
- java基礎:enum列舉Java
- java中列舉(Enum)使用Java
- 再談java列舉enumJava
- 聊一聊Java的列舉enumJava
- TypeScript 列舉enumTypeScript
- JAVA列舉使用詳解Java
- Linux命令列:cURL的十種常見用法Linux命令列
- Java Enum 個人見解Java
- 關於Java中列舉Enum的深入剖析Java
- JAVA 基礎 - ENUM 列舉的簡單使用Java
- Java 列舉 switch的用法Java
- Java enum 列舉還可以這麼用Java
- ENUM列舉型別型別
- iOS - OC Enum 列舉iOS
- Rust的列舉型別EnumRust型別
- Java列舉enum可以有抽象方法! -RecepİnançJava抽象NaN
- Java列舉:小小enum,優雅而乾淨Java
- 【python】Enum 列舉類Python
- JavaScript陣列常見用法JavaScript陣列
- Kotlin——中級篇(五):列舉類(Enum)、介面類(Interface)詳解Kotlin
- 7種常見的無線網路攻擊型別詳解!型別
- 優雅使用前端列舉Enum,符合國標的那種!前端
- Java for迴圈的幾種用法詳解Java
- 聊聊TypeScript中列舉物件(Enum)TypeScript物件
- mysql之ENUM列舉型別MySql型別
- 認知列舉(C# Enum)C#
- JAVA中常見的阻塞佇列詳解Java佇列
- TS — 列舉(詳解)