日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Java枚舉:小小enum,優(yōu)雅而干凈

《Java編程思想》中有這么一句話:“有時(shí)恰恰因?yàn)樗悴拍軌颉畠?yōu)雅而干凈’地解決問(wèn)題”——這句話說(shuō)的是誰(shuí)呢?就是本篇的主角——枚舉(Enum)——大家鼓掌了。

創(chuàng)新互聯(lián)公司長(zhǎng)期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為天河企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),天河網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

在之前很長(zhǎng)時(shí)間一段時(shí)間里,我都不怎么用枚舉,因?yàn)榭偢杏X(jué)它沒(méi)什么用處——這其實(shí)就是“自我認(rèn)知”的短見(jiàn)。當(dāng)一個(gè)人一直蹲在自己的深井里而不敢跳出來(lái)的話,那他真的只能看到井口那么大點(diǎn)的天空。

隨著時(shí)間的推移,我做的項(xiàng)目越來(lái)越多,和枚舉見(jiàn)面的機(jī)會(huì)也越來(lái)越多,于是我就漸漸地對(duì)它越來(lái)越有興趣,研究得多了,才發(fā)現(xiàn)原來(lái)枚舉如此的優(yōu)秀。

1)枚舉的常規(guī)用法

一個(gè)精簡(jiǎn)的枚舉非常的干凈優(yōu)雅,見(jiàn)下例。

public enum Chenmo {
    WANGER, WANGSAN, WANGSI
}

我們?yōu)槌聊杜e創(chuàng)建了三個(gè)值,分別是王二、王三、王四。這段代碼實(shí)際上調(diào)用了3次Enum(String name, int ordinal)(ordinal單詞的意思為順序),也就是:

new Enum("WANGER", 0);
new Enum("WANGSAN", 1);
new Enum("WANGSI", 2);

我們來(lái)遍歷輸出一下枚舉:

for (Chenmo e : Chenmo.values()) {
    System.out.println(e);
}
//輸出
//WANGER
//WANGSAN
//WANGSI

2)作為switch的判斷條件

使用枚舉作為switch語(yǔ)句判斷條件能讓我們的代碼可讀性更強(qiáng),示例如下。

Chenmo key = Chenmo.WANGER;
switch (key) {
case WANGSI:
    System.out.println("今天我送出一個(gè)CSDN大鼠標(biāo)墊");
    break;
case WANGSAN:
    System.out.println("今天我被坑一個(gè)CSDN學(xué)院年卡");
    break;
default:
    System.out.println("今天我一邊高興,一邊失落");
    break;
}

在通過(guò)case關(guān)鍵字判斷的時(shí)候,可以直接使用枚舉值,非常簡(jiǎn)潔。另外,在編譯期間限定類型,可以有效的避免越界的情況——字符串常量類型在作為switch判斷條件的時(shí)候很容易因?yàn)檎`寫(xiě)而發(fā)生越界問(wèn)題。

3)枚舉實(shí)現(xiàn)單例

《Effective Java》一書(shū)中對(duì)使用枚舉實(shí)現(xiàn)單例的方式推崇備至:

使用枚舉實(shí)現(xiàn)單例的方法雖然還沒(méi)有廣泛采用,但是單元素的枚舉類型已經(jīng)成為實(shí)現(xiàn)Singleton的最佳方法。

我覺(jué)得“雖然還沒(méi)有廣泛采用”幾個(gè)字可以去掉了,時(shí)至今日,大家應(yīng)該都知道:使用枚舉實(shí)現(xiàn)單例是一種非常好的方式。

先來(lái)看“雙重校驗(yàn)鎖”實(shí)現(xiàn)的單例:

public class SingleTon2 {

     // 私有化構(gòu)造方法
    private SingleTon2() {
    };

    private static volatile SingleTon2 singleTon = null;

    public static SingleTon2 getInstance() {

        // 第一次校驗(yàn)
        if (singleTon == null) {
            synchronized (SingleTon2.class) {
                // 第二次校驗(yàn)
                if (singleTon == null) {
                    singleTon = new SingleTon2();
                }
            }
        }
        return singleTon;
    }
}

再來(lái)看枚舉實(shí)現(xiàn)的單例:

public enum SingleTon {

     INSTANCE;

    public void method() {
        System.out.println("我很快樂(lè)!");
    }
}

不比不知道,一比嚇一跳啊!枚舉方式的單例簡(jiǎn)單到爆——為了不至于看起來(lái)太過(guò)精簡(jiǎn),我還加了一個(gè)輸出“我很快樂(lè)”的方法。

枚舉實(shí)現(xiàn)的單例可輕松地解決兩個(gè)問(wèn)題:

①、線程安全問(wèn)題。因?yàn)镴ava虛擬機(jī)在加載枚舉類的時(shí)候,會(huì)使用ClassLoader的loadClass方法,這個(gè)方法使用了同步代碼塊來(lái)保證線程安全。

②、避免反序列化破壞單例。因?yàn)槊杜e的反序列化并不通過(guò)反射實(shí)現(xiàn)。

4)枚舉可與數(shù)據(jù)庫(kù)交互

我們可以配合Mybatis將數(shù)據(jù)庫(kù)字段轉(zhuǎn)換為枚舉類型?,F(xiàn)在假設(shè)有一個(gè)數(shù)據(jù)庫(kù)字段check_type的類型如下:

`check_type` int(1) DEFAULT NULL COMMENT '檢查類型(1:未通過(guò)、2:通過(guò))',

它對(duì)應(yīng)的枚舉類型為CheckType,代碼如下:

public enum CheckType {
    NO_PASS(0, "未通過(guò)"), PASS(1, "通過(guò)");
    private int key;

    private String text;

    private CheckType(int key, String text) {
        this.key = key;
        this.text = text;
    }

    public int getKey() {
        return key;
    }

    public String getText() {
        return text;
    }

    private static HashMap map = new HashMap();
    static {
        for(CheckType d : CheckType.values()){
            map.put(d.key, d);
        }
    }

    public static CheckType parse(Integer index) {
        if(map.containsKey(index)){
            return map.get(index);
        }
        return null;
    }
}

CheckType枚舉類比我們剛開(kāi)始見(jiàn)到的那個(gè)Chenmo枚舉類要復(fù)雜一些。

第一,CheckType新添加了構(gòu)造方法,還有兩個(gè)字段,key為int型,text為String型。

第二,CheckType中有一個(gè)public static CheckType parse(Integer index)方法,可將一個(gè)Integer通過(guò)key的匹配轉(zhuǎn)化為枚舉類型。

那么現(xiàn)在,我們可以在Mybatis的配置文件中使用typeHandler將數(shù)據(jù)庫(kù)字段轉(zhuǎn)化為枚舉類型。


  
  

其中checkType字段對(duì)應(yīng)的類如下:

public class CheckLog implements Serializable {

    private String id;
    private CheckType checkType;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public CheckType getCheckType() {
        return checkType;
    }

    public void setCheckType(CheckType checkType) {
        this.checkType = checkType;
    }
}

CheckTypeHandler轉(zhuǎn)換器的類源碼如下:

public class CheckTypeHandler extends BaseTypeHandler {

    @Override
    public CheckType getNullableResult(ResultSet rs, String index) throws SQLException {
        return CheckType.parse(rs.getInt(index));
    }

    @Override
    public CheckType getNullableResult(ResultSet rs, int index) throws SQLException {
        return CheckType.parse(rs.getInt(index));
    }

    @Override
    public CheckType getNullableResult(CallableStatement cs, int index) throws SQLException {
        return CheckType.parse(cs.getInt(index));
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int index, CheckType val, JdbcType arg3) throws SQLException {
        ps.setInt(index, val.getKey());
    }
}

CheckTypeHandler 的核心功能就是調(diào)用CheckType枚舉類的parse()方法對(duì)數(shù)據(jù)庫(kù)字段進(jìn)行轉(zhuǎn)換。

5)枚舉會(huì)比靜態(tài)常量更消耗內(nèi)存嗎?

說(shuō)完枚舉最常用的4個(gè)知識(shí)點(diǎn)后,我們來(lái)討論一下“枚舉會(huì)比靜態(tài)常量更消耗內(nèi)存嗎?”這個(gè)話題——知乎上有人問(wèn)這樣的問(wèn)題,還有很多人參與回答。

按我的理解,問(wèn)這個(gè)問(wèn)題的人就好像是在問(wèn)“0.000,001”比“0.000,000,99”大嗎?你說(shuō)是嗎?


上一篇:如果有人再問(wèn)你 Java 的反射,把這篇文章扔給他

下一篇:Java注解(Annotation):請(qǐng)不要小看我!

微信搜索「*沉默王×××免費(fèi)視頻**」獲取 500G 高質(zhì)量教學(xué)視頻(已分門(mén)別類)。


當(dāng)前題目:Java枚舉:小小enum,優(yōu)雅而干凈
網(wǎng)頁(yè)網(wǎng)址:http://www.dlmjj.cn/article/iiiphs.html