說(shuō)說(shuō)Java枚舉類型

簡(jiǎn)書 占小狼
轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝!

enum實(shí)現(xiàn)

JDK5中提供了Java枚舉類型的實(shí)現(xiàn)瞒瘸,與其說(shuō)是一種新類型,倒不如說(shuō)是一種語(yǔ)法糖熄浓。

public enum Season {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER
}

通過(guò)反編譯工具 jad來(lái)看看這段代碼是如何實(shí)現(xiàn)的情臭,反編譯后的代碼如下:

public final class Season extends Enum {

    public static Season[] values() {
        return (Season[])$VALUES.clone();
    }

    public static Season valueOf(String s) {
        return (Season)Enum.valueOf(Season, s);
    }

    private Season(String s, int i) {
        super(s, i);
    }

    public static final Season SPRING;
    public static final Season SUMMER;
    public static final Season AUTUMN;
    public static final Season WINTER;
    private static final Season $VALUES[];

    static {
        SPRING = new Season("SPRING", 0);
        SUMMER = new Season("SUMMER", 1);
        AUTUMN = new Season("AUTUMN", 2);
        WINTER = new Season("WINTER", 3);
        $VALUES = (new Season[] {
            SPRING, SUMMER, AUTUMN, WINTER
        });
    }
}

通過(guò)反編譯的代碼可以發(fā)現(xiàn):
1、Season是一個(gè)普通的類赌蔑,繼承自Enum俯在,并通過(guò)final關(guān)鍵字修飾,避免被繼承娃惯,
2跷乐、枚舉中的SPRING、SUMMER趾浅、AUTUMN和WINTER是Season類的靜態(tài)實(shí)例愕提,并在類構(gòu)造器<clinit>方法中進(jìn)行初始化馒稍。
3、values()方法返回私有變量$VALUES[]的副本浅侨,$VALUES[]也是在<clinit>方法中進(jìn)行初始化筷黔。

如何使用enum

1、單例模式
JVM類加載的那些事中仗颈,我們已經(jīng)知道類構(gòu)造器<clinit>只能被一個(gè)線程在類加載的初始化階段進(jìn)行執(zhí)行佛舱,所以枚舉的每個(gè)實(shí)例在Java堆中有且只有一個(gè)副本,這種特性讓枚舉很容易就實(shí)現(xiàn)了單例模式挨决,這也正是Effective Java作者 Josh Bloch 提倡使用實(shí)現(xiàn)單利模式的方式请祖。

public enum Singleton { INSTANCE;}

2、在switch中使用
3脖祈、自定義字段和方法
enum中除了默認(rèn)字段和方法之外肆捕,可以針對(duì)業(yè)務(wù)邏輯進(jìn)行自定義。

public enum EnumTest {
  PLUS("+") {
      @Override
      public int bind(int arg1, int arg2) {
          return arg1 + arg2;
      }
  },
  SUB("-") {
      @Override
      public int bind(int arg1, int arg2) {
          return arg1 - arg2;
      }
  };

  final String operation;

  EnumTest(String operation) {
      this.operation = operation;
  }

  abstract int bind(int arg1, int arg2);
}

4盖高、實(shí)現(xiàn)接口

interface Operation{
    int operate(int arg1, int arg2);
}

public enum EnumTest implements Operation {

    PLUS("+") {
        @Override
        public int operate(int arg1, int arg2) {
            return arg1 + arg2;
        }
    },
    SUB("-") {
        @Override
        public int operate(int arg1, int arg2) {
            return arg1 - arg2;
        }
    };

    final String operation;

    EnumTest(String operation) {
        this.operation = operation;
    }
}

在實(shí)際應(yīng)用中慎陵,可以把 "+"、"-" 作為key喻奥,PLUS和SUB作為value席纽,預(yù)先保存在hashMap中,具體使用方式如下:

Operation operation = hashMap.get("+");
int result = operation.operate(1, 2);

END撞蚕。
我是占小狼润梯。
在魔都艱苦奮斗,白天是上班族甥厦,晚上是知識(shí)服務(wù)工作者纺铭。
如果讀完覺得有收獲的話,記得關(guān)注和點(diǎn)贊哦刀疙。
非要打賞的話舶赔,我也是不會(huì)拒絕的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谦秧,一起剝皮案震驚了整個(gè)濱河市竟纳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌油够,老刑警劉巖蚁袭,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異石咬,居然都是意外死亡揩悄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門鬼悠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)删性,“玉大人亏娜,你說(shuō)我怎么就攤上這事〉磐Γ” “怎么了维贺?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)巴帮。 經(jīng)常有香客問(wèn)我溯泣,道長(zhǎng),這世上最難降的妖魔是什么榕茧? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任垃沦,我火速辦了婚禮,結(jié)果婚禮上用押,老公的妹妹穿的比我還像新娘肢簿。我一直安慰自己,他們只是感情好蜻拨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布池充。 她就那樣靜靜地躺著,像睡著了一般缎讼。 火紅的嫁衣襯著肌膚如雪收夸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天休涤,我揣著相機(jī)與錄音咱圆,去河邊找鬼。 笑死功氨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的手幢。 我是一名探鬼主播捷凄,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼围来!你這毒婦竟也來(lái)了跺涤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤监透,失蹤者是張志新(化名)和其女友劉穎桶错,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胀蛮,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡院刁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了粪狼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片退腥。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡任岸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狡刘,到底是詐尸還是另有隱情享潜,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布嗅蔬,位于F島的核電站剑按,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏澜术。R本人自食惡果不足惜艺蝴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘪板。 院中可真熱鬧吴趴,春花似錦、人聲如沸侮攀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)兰英。三九已至撇叁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畦贸,已是汗流浹背陨闹。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留薄坏,地道東北人趋厉。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像胶坠,于是被迫代替她去往敵國(guó)和親君账。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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