1. 程式人生 > >列舉的用法、列舉與單例、Enum類

列舉的用法、列舉與單例、Enum類

轉載:https://www.cnblogs.com/hyl8218/p/5088287.html

enum 的全稱為 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。

下面是我在使用 enum 過程中的一些經驗和總結,主要包括如下內容:

原始的介面定義常量

public interface IConstants {

    String MON = "Mon";

    String TUE = "Tue";

    String WED = "Wed";

    String THU = "Thu";

    String FRI = "Fri";

    String SAT = "Sat";

    String SUN = "Sun";

}

      建立列舉型別要使用 enum 關鍵字,隱含了所建立的型別都是 java.lang.Enum 類的子類(java.lang.Enum 是一個抽象類)。列舉型別符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示列舉型別的名稱。列舉型別的每一個值都將對映到 protected Enum(String name, int ordinal) 建構函式中,在這裡,每個值的名稱都被轉換成一個字串,並且序數設定表示了此設定被建立的順序。

語法(定義)


package com.hmw.test;

/**

 * 列舉測試類

 * @author <a href="mailto:
[email protected]
">何明旺</a>  */ public enum EnumTest {     MON, TUE, WED, THU, FRI, SAT, SUN; }

這段程式碼實際上呼叫了7次 Enum(String name, int ordinal):


new Enum<EnumTest>("MON",0);

new Enum<EnumTest>("TUE",1);

new Enum<EnumTest>("WED",2);

    ... ...

遍歷、switch 等常用操作

對enum進行遍歷和switch的操作示例程式碼:

public class Test {

    public static void main(String[] args) {

        for (EnumTest e : EnumTest.values()) {

            System.out.println(e.toString());

        }

        System.out.println("----------------我是分隔線------------------");

        EnumTest test = EnumTest.TUE;

        switch (test) {

        case MON:

            System.out.println("今天是星期一");

            break;

        case TUE:

            System.out.println("今天是星期二");

            break;

        // ... ...

        default:

            System.out.println(test);

            break;

        }

    }

}

輸出結果:


MON

TUE

WED

THU

FRI

SAT

SUN

----------------我是分隔線------------------

今天是星期二

enum 物件的常用方法介紹

int compareTo(E o) 
          比較此列舉與指定物件的順序。

Class<E> getDeclaringClass() 
          返回與此列舉常量的列舉型別相對應的 Class 物件。

String name() 
          返回此列舉常量的名稱,在其列舉宣告中對其進行宣告。

int ordinal() 
          返回列舉常量的序數(它在列舉宣告中的位置,其中初始常量序數為零)。

String toString()

          返回列舉常量的名稱,它包含在宣告中。

static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 
          返回帶指定名稱的指定列舉型別的列舉常量。

public class Test {

    public static void main(String[] args) {

        EnumTest test = EnumTest.TUE;

        //compareTo(E o)

        switch (test.compareTo(EnumTest.MON)) {

        case -1:

            System.out.println("TUE 在 MON 之前");

            break;

        case 1:

            System.out.println("TUE 在 MON 之後");

            break;

        default:

            System.out.println("TUE 與 MON 在同一位置");

            break;

        }

         

        //getDeclaringClass()

        System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());

         

        //name() 和  toString()

        System.out.println("name(): " + test.name());

        System.out.println("toString(): " + test.toString());

         

        //ordinal(), 返回值是從 0 開始

        System.out.println("ordinal(): " + test.ordinal());

    }

}

輸出結果:

TUE 在 MON 之後

getDeclaringClass(): com.hmw.test.EnumTest

name(): TUE

toString(): TUE

ordinal(): 1

給 enum 自定義屬性和方法

給 enum 物件加一下 value 的屬性和 getValue() 的方法:

package com.hmw.test;

/**

 * 列舉測試類

 *

 * @author <a href="mailto:[email protected]">何明旺</a>

 */

public enum EnumTest {

    MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) {

        @Override

        public boolean isRest() {

            return true;

        }

    },

    SUN(0) {

        @Override

        public boolean isRest() {

            return true;

        }

    };



    private int value;



    private EnumTest(int value) {

        this.value = value;

    }



    public int getValue() {

        return value;

    }



    public boolean isRest() {

        return false;

    }

}

public class Test {

    public static void main(String[] args) {

        System.out.println("EnumTest.FRI 的 value = " + EnumTest.FRI.getValue());

    }

}

輸出結果:

EnumTest.FRI 的 value = 5

EnumSet,EnumMap 的應用

public class Test {

    public static void main(String[] args) {

        // EnumSet的使用

        EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);

        for (EnumTest day : weekSet) {

            System.out.println(day);

        }



        // EnumMap的使用

        EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);

        weekMap.put(EnumTest.MON, "星期一");

        weekMap.put(EnumTest.TUE, "星期二");

        // ... ...

        for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {

            Entry<EnumTest, String> entry = iter.next();

            System.out.println(entry.getKey().name() + ":" + entry.getValue());

        }

    }

}

原理分析

        enum 的語法結構儘管和 class 的語法不一樣,但是經過編譯器編譯之後產生的是一個class檔案。該class檔案經過反編譯可以看到實際上是生成了一個類,該類繼承了java.lang.Enum<E>。EnumTest 經過反編譯(javap com.hmw.test.EnumTest 命令)之後得到的內容如下:

public class com.hmw.test.EnumTest extends java.lang.Enum{

    public static final com.hmw.test.EnumTest MON;

    public static final com.hmw.test.EnumTest TUE;

    public static final com.hmw.test.EnumTest WED;

    public static final com.hmw.test.EnumTest THU;

    public static final com.hmw.test.EnumTest FRI;

    public static final com.hmw.test.EnumTest SAT;

    public static final com.hmw.test.EnumTest SUN;

    static {};

    public int getValue();

    public boolean isRest();

    public static com.hmw.test.EnumTest[] values();

    public static com.hmw.test.EnumTest valueOf(java.lang.String);

    com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest);

}

所以,實際上 enum 就是一個 class,只不過 java 編譯器幫我們做了語法的解析和編譯而已。

總結

    可以把 enum 看成是一個普通的 class,它們都可以定義一些屬性和方法,不同之處是:enum 不能使用 extends 關鍵字繼承其他類,因為 enum 已經繼承了 java.lang.Enum(java是單一繼承)。

相關推薦

列舉用法列舉Enum

轉載:https://www.cnblogs.com/hyl8218/p/5088287.html enum 的全稱為 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。 下面是我在使用 enum 過程中的一些經驗和總結,主

3設計模式—工廠代理介面卡觀察者

1、  設計模式——單例模式單例模式負責建立自己的物件,同時確保只有一個物件被建立。比如,我們要統計網站的訪問使用者數,在任何時候都只有一個物件在記錄使用者數,否則就可能出現重複寫入的問題,這是單例模式應用的一個場景實現如下class Person{//私有建構函式,組織物件

設計模式列舉

單例設計模式:     特徵是構造方法私有化,而後在類的內部提供有一個static本類物件,並且利用static方法取得此物件。   程式碼如下:  class Singleton{private static final Singleton INSTANCE = new

SwiftObjective-C 模式 (Singleton)

app 賦值 uil imp ide 效果 func instance 發現 本文的單例模式分為嚴格單例模式和不嚴格單例模式。單例模式要求一個類有一個實例,有公開接口可以訪問這個實例。嚴格單例模式,要求一個類只有一個實例;不嚴格單例模式,可以創建多個實例。 有的類只能有一個

編程經常使用設計模式具體解釋--(上篇)(工廠建造者原型)

-a 裝飾器模式 nds support art 類的繼承 兩個 開放 lose 參考來自:http://zz563143188.iteye.com/blog/1847029 一、設計模式的分類 整體來說設計模式分為三大類: 創建型模式。共五種:工廠方法模式、抽

設計模式:對象生成(工廠抽象工廠)

添加 對象實例 log return ray 靜態 學習 線程 tco 對象的創建有時會成為面向對象設計的一個薄弱環節。我們可以使用多種面向對象設計方案來增加對象的創建的靈活性。 單例模式:生成一個且只生成一個對象實例的特殊類 工廠方法模式:構建創建者類的繼承層級

Python第五課, 對象排序繼承

減少代碼冗余 and sta 類繼承 single 擁有 person 繼承 port 對象使用:類名(參數) 可以使用self調用 def _new_(cls) 用來創建對象,但必須有返回值,就是實例化 def _init_(self,參數) 初始化方法,用來給參數定義初

python—89 自定義的admin後臺管理框架 1啟動文件 2源碼(註冊功能創建) 3設計url

ready def str try pytho site 字典 style 啟動文件 admin後臺管理框架 仿照admin組件,開發stark組件 1、啟動文件   執行每一個app下的stark.py文件   重寫一個def ready() 函數  autodis

《設計模式》之一文帶你理解JDK動態代理CGLIB動態代理靜態代理

個人認為我在動態代理方面的分析算是比較深入了,下次更新再修改一下,爭取做到最好,後續還有建造者模式、模板方法、介面卡、外觀、責任鏈、策略和原型模式的深入!各位讀者如果覺得還不錯的可以持續關注哦。謝謝各位!!! 我的github,到時上傳例子程式碼 https://github.com

建立模式----模式

一、單例模式 單例模式分為:懶漢模式和餓漢模式。 單例物件(Singleton)是一種常用的設計模式。在Java應用中,單例物件能保證在一個JVM中,該物件只有一個例項存在。這樣的模式有幾個好處: 1、某些類建立比較頻繁,對於一些大型的物件,這是一筆很大的系統開銷。 2、省去了new

redis主從模式sentinel以及叢集的配置方式及優缺點對比

redis作為一種高效的快取框架,使用是非常廣泛的,在資料儲存上,在執行時其將資料儲存在記憶體中,以實現資料的高效讀寫,並且根據定製的持久化規則不同,其會不定期的將資料持久化到硬碟中。另外相較於其他的NoSql資料庫,redis提供了非常豐富的資料結構,如dict,s

Spring IOC(一)+容器關閉了,getBean獲取的物件(小老弟)你咋還在蹦躂? day--07

Spring IOC(一)單例、非單例+容器關閉了,getBean獲取的物件(小老弟)你咋還在蹦躂? day–07 一路綠燈學過去的就不記了,只記錄重點和實驗過程,另外內容順序排列可能引起不適,但是是根我碰到問題順序走的,,,在這向有一丁點可能看到這篇文章的您抱歉。 一、.Sprin

C# 基礎(十四)C#模式:首先介紹 執行緒多執行緒加鎖 模式。然後介紹模式的執行緒同步:多執行緒有序訪問共享記憶體。

一、簡介 本篇文章將介紹如何使用單例模式,也就是類的例項化,在整個專案的生命週期內,只例項化一次。在單例模式中,往往可以看到如SourceCode.cs:這樣的結構的。 SourceCode.cs: public class Singleton { private static

spring執行緒安全事務等疑惑 收集

文章轉載於: http://haidaoqi3630.iteye.com/blog/1920944 http://www.cnblogs.com/davidwang456/p/3832949.html Spring的事務傳遞機制: PROPAGATION_REQUIRED 如

ThinkPHP筆記5——PHP常用設計模式(工廠註冊樹)

<?php //單例模式 class Site{ //屬性 public $siteName; //本類的靜態例項 private static $instance = null; //禁用構造方法 private function __construct($siteN

struts1struts2spring mvc的action和HttpServletfilter是否

struts1 package com.struts1.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; impo

iOS 基礎02--屬性修飾符深淺拷貝

iOS 基礎02—單例、屬性修飾符、深淺拷貝 單例 講單例就必須得先講講單例這種設計模式的作用和最可能出現的應用場景,以便更好地理解這種設計模式: 比如在整個程序當中,我們經常會用到使用者資訊,這就要求我們能夠把使用者資訊存在一個統一的物件當中,以便於對資訊進行操作。 有對情況下,某個類也可能只能允許只

設計模式(一):單例模式 JVM載入機制 JDK原始碼學習筆記——Enum列舉使用及原理 Java併發(七):雙重檢驗鎖定DCL Java併發(二):Java記憶體模型 Java併發(二):Java記憶體模型 Java併發(七):雙重檢驗鎖定DCL JDK原始碼學習筆記——Enum列舉使用及原理

單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許一個例項存在。 單例模式一般體現在類宣告中,單例的類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。 適用場合: 需要頻繁的進行建立和銷燬的物件; 建立物

模式&&工廠模式

單例、多例模式 假設,老張開車去東北 public class Car { public void run(){ System.out.println("冒著煙奔跑中car........."); } } pub

java設計模式-每天三個設計模式之工廠建造者

    前情提要            在上篇文章中介紹了面向物件程式設計的七個基本原則,分別是單一職責,裡式替換、依賴注入、介面分離、迪米特原則、開閉原則、優先使用組合而不是繼承原則。    本文重點 工廠模式單例模式建造者模式    工廠模式,工廠模式又分為簡單工廠、工廠