Java新特性之Java5的那些事兒-枚舉

Java5 前常量類使用設(shè)計(jì)的缺陷

? Java5出現(xiàn)之前垄琐,如果我們要通過Class 來表示一類常量或某幾類常量疏尿,通常會(huì)采用下面的代碼來實(shí)現(xiàn)(這里用顏色來舉例):比如在實(shí)現(xiàn)一個(gè)簡單的畫圖軟件時(shí)晚岭,可能會(huì)涉及到畫筆的很多顏色值君仆,此時(shí)我們會(huì)定義一下常量值來代表某個(gè)顏色值:

public class ColorEntity {
    public static final int BLACK=1;
    public static final int WHITE=2;
    public static final int YELLOW=3;
    public static final int BLUE=4;
    public static final int RED=5;
    private int type;
    private int id;
}

此時(shí)使用該類時(shí) 就會(huì)出現(xiàn)一些問題:

    public static void main(String[] args) {
        ColorEntity colorEntity=new ColorEntity();
        colorEntity.setId(1);
        colorEntity.setType(1);//1代表神馬??喇辽?
    }

這里的type=1 到底代表什么意思牡昆,雖然開發(fā)人員理解1對(duì)應(yīng)BLACK,但會(huì)造成代碼可讀性差,不易于后期維護(hù)掂器,因?yàn)檫@里的1在1.0版代表的為BLACK沒錯(cuò)亚皂,但可能到2.0版后1就不一定代表BLACK,或許是WHITE国瓮、GREEN灭必、RED...

當(dāng)然實(shí)例化ColorEntity對(duì)象時(shí)這里的代碼可以有以下改進(jìn):

ColorEntity colorEntity=new ColorEntity();
colorEntity.setId(1);
// 不是每個(gè)程序員都能夠做到的 大量離散的常量寫在當(dāng)前類中也不易于后期維護(hù)
colorEntity.setType(ColorEntity.BLACK);

此時(shí)不是每個(gè)程序員都能夠做到的 大量離散的常量寫在當(dāng)前類中也不易于后期維護(hù)!!!

? 枚舉就是為了這樣的問題而誕生的狞谱。Java5引入了枚舉特性,存放在 java.lang 包中 禁漓,枚舉是一個(gè)特定類型的類跟衅。所有枚舉都是Java中的新類java.lang.Enum的隱式子類, 此類不能手工進(jìn)行子類定義播歼。

枚舉定義

? 創(chuàng)建枚舉類型要使用 enum 關(guān)鍵字伶跷,隱含了所創(chuàng)建的類型都是 java.lang.Enum 類的子類(java.lang.Enum 是一個(gè)抽象類)。枚舉類型符合通用模式class Enum<E extends Enum<E>>秘狞,而E表示枚舉類型的名稱叭莫。枚舉類型的每一個(gè)值都將映射到protected Enum(String name, int ordinal) 構(gòu)造函數(shù)中,在這里谒撼,每個(gè)值的名稱都被轉(zhuǎn)換成一個(gè)字符串食寡,并且序數(shù)設(shè)置表示了此設(shè)置被創(chuàng)建的順序。

1553159093426.png
1553159760222.png

定義顏色枚舉類ColorEnum_1:

public  enum  ColorEnum_1{
    BLACK,WHITE,YELLOW,BLUE,RED;
}

此時(shí) Enum類 構(gòu)造方法相當(dāng)于被調(diào)用5次廓潜。

枚舉遍歷與switch判斷

    /**
     * 顏色枚舉類遍歷
     */
    public static void test02(){
        for(ColorEnum_1 ColorEnum_1:ColorEnum_1.values()){
            System.out.println(ColorEnum_1.name() +","+ ColorEnum_1.ordinal());
        }
    }

遍歷結(jié)果如下:

1553160055506.png

枚舉類同樣支持switch 判斷

ColorEnum_1 ColorEnum_1 = ColorEnum_1.BLACK;
switch (ColorEnum_1){
    case RED:
        System.out.println("紅色畫筆");
        break;
    case BLACK:
        System.out.println("黑色畫筆");
        break;
    case BLUE:
        System.out.println("藍(lán)色畫筆");
        break;
    default:
        System.out.println("默認(rèn)顏色");
        break;
}

結(jié)果如下:

2019-03-21_172605.png

枚舉常用方法

int compareTo(E o) 比較此枚舉與指定對(duì)象的順序抵皱。
Class<E> getDeclaringClass() 返回與此枚舉常量的枚舉類型相對(duì)應(yīng)的 Class 對(duì)象。
String name() 返回此枚舉常量的名稱辩蛋,在其枚舉聲明中對(duì)其進(jìn)行聲明呻畸。
int ordinal() 返回枚舉常量的序數(shù)(它在枚舉聲明中的位置,其中初始常量序數(shù)為零)悼院。
String toString()返回枚舉常量的名稱伤为,它包含在聲明中。
static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 返回帶指定名稱的指定枚舉類型的枚舉常量据途。

代碼示例:


//compareTo(E o) 比較兩個(gè)枚舉類順序 返回順序差值
switch (ColorEnum_1.compareTo(ColorEnum_1.WHITE)) {
    case -1:
        System.out.println("Black 在 White 順序前");
        break;
    case 1:
        System.out.println("Black 在 White 順序后");
        break;
    default:
        System.out.println("Black 與 White 在同一位置");
        break;
}
//getDeclaringClass()   枚舉類相對(duì)應(yīng)class 名稱
System.out.println("getDeclaringClass(): " + ColorEnum_1.getDeclaringClass().getName());

//name() 和  toString()  
System.out.println("name(): " + ColorEnum_1.name());
System.out.println("toString(): " + ColorEnum_1.toString());

//ordinal()绞愚, 返回值是從 0 開始
System.out.println("ordinal(): " + ColorEnum_1.ordinal());

結(jié)果如下:

1553161363427.png

枚舉實(shí)現(xiàn)顏色常量類功能-自定義屬性與方法

  • 枚舉類定義
public  enum ColorEnum_2 {
    BLACK(1),WHITE(2),YELLOW(3),BLUE(4),RED(5);
    private int type;
    ColorEnum_2(int type) {
        this.type = type;
    }

    public int getType() {
        return type;
    }
}
  • 使用枚舉
// 使用枚舉給顏色類型賦值
ColorEntity colorEntity = new ColorEntity();
colorEntity.setId(1);
// 通過枚舉執(zhí)行畫筆顏色值 代碼清晰 簡單!S币健位衩!
colorEntity.setType(ColorEnum_2.BLACK.getType());

枚舉原理分析

Enum 的語法結(jié)構(gòu)盡管和 class 的語法不一樣,但是經(jīng)過編譯器編譯之后產(chǎn)生的是一個(gè)class文件熔萧。該class文件經(jīng)過反編譯可以看到實(shí)際上是生成了一個(gè)類糖驴,該類繼承了java.lang.Enum<E>。 在ColorEnum_2 類class所在目錄執(zhí)行javap -c  ColorEnum_2  命令可以看到Enum 經(jīng)過編譯之后就是我們熟悉的class類佛致,到這里基本就真相大白啦贮缕!
public final class com.lzj.ColorEnum_2 extends java.lang.Enum<com.lzj.ColorEnum_2> {
  public static final com.lzj.ColorEnum_2 BLACK;
  public static final com.lzj.ColorEnum_2 WHITE;
  public static final com.lzj.ColorEnum_2 YELLOW;
  public static final com.lzj.ColorEnum_2 BLUE;
  public static final com.lzj.ColorEnum_2 RED;
  ...  
 }

所以,我們說enum 就是一個(gè) class,只不過 java 編譯器幫我們做了語法的解析和編譯而已俺榆。在開發(fā)中感昼,通常用于表示諸如顏色、方式肋演、類別抑诸、狀態(tài)等等數(shù)目有限烂琴、形式離散、表達(dá)又極為明確的量蜕乡,應(yīng)當(dāng)盡量舍棄常量表示的做法奸绷,而將枚舉作為首要的選擇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末层玲,一起剝皮案震驚了整個(gè)濱河市号醉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辛块,老刑警劉巖畔派,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異润绵,居然都是意外死亡线椰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門尘盼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憨愉,“玉大人,你說我怎么就攤上這事卿捎∨渥希” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵午阵,是天一觀的道長躺孝。 經(jīng)常有香客問我,道長底桂,這世上最難降的妖魔是什么植袍? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮籽懦,結(jié)果婚禮上奋单,老公的妹妹穿的比我還像新娘。我一直安慰自己猫十,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布呆盖。 她就那樣靜靜地躺著拖云,像睡著了一般。 火紅的嫁衣襯著肌膚如雪应又。 梳的紋絲不亂的頭發(fā)上宙项,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音株扛,去河邊找鬼尤筐。 笑死汇荐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盆繁。 我是一名探鬼主播掀淘,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼油昂!你這毒婦竟也來了革娄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤冕碟,失蹤者是張志新(化名)和其女友劉穎拦惋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體安寺,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厕妖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挑庶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片言秸。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挠羔,靈堂內(nèi)的尸體忽然破棺而出井仰,到底是詐尸還是另有隱情,我是刑警寧澤破加,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布俱恶,位于F島的核電站,受9級(jí)特大地震影響范舀,放射性物質(zhì)發(fā)生泄漏合是。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一锭环、第九天 我趴在偏房一處隱蔽的房頂上張望聪全。 院中可真熱鬧,春花似錦辅辩、人聲如沸难礼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛾茉。三九已至,卻和暖如春撩鹿,著一層夾襖步出監(jiān)牢的瞬間谦炬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留键思,地道東北人础爬。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像吼鳞,于是被迫代替她去往敵國和親看蚜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 1. 概述 枚舉(enum)全寫為的全稱為:enumeration赖条。是jdk1.5才新引進(jìn)的概念失乾,在Java中en...
    WY長河閱讀 692評(píng)論 0 0
  • 一 Java 枚舉7常見種用法DK1.5引入了新的類型——枚舉。在 Java 中它雖然算個(gè)“小”功能纬乍,卻給我的開發(fā)...
    歡樂時(shí)光歡樂你我閱讀 867評(píng)論 0 6
  • 問:Java 枚舉類比較用 == 還是 equals碱茁,有什么區(qū)別? 答:java 枚舉值比較用 == 和 equa...
    Little丶Jerry閱讀 1,681評(píng)論 1 20
  • 2018年5月10日 星期四 早上6點(diǎn)10分仿贬,我和瑞昕都起床了纽竣。洗漱完,聽到妹妹的聲音茧泪,瑞昕走進(jìn)媽媽和妹...
    祥魯閱讀 201評(píng)論 0 2
  • 挑戰(zhàn)者:Google 公司 當(dāng)上世紀(jì)90 年代末的互聯(lián)網(wǎng)大潮席卷硅谷時(shí)蜓氨,還在學(xué)校讀博士生的拉里?佩奇和謝爾蓋?布林...
    幻無名閱讀 1,064評(píng)論 0 1