Java & Groovy & Scala & Kotlin - 24.枚舉

Overview

本節(jié)主要介紹各種語言中的枚舉實現(xiàn)。枚舉是種特殊的類觅闽,主要用于構(gòu)建一組特定的值來表示某個屬性的取值只能在一定范圍內(nèi)。

Java 篇

在 Java 中枚舉在某些場合可以被靜態(tài)常量代替,但是枚舉可以有自己的屬性也可以有自己的方法甜害,而靜態(tài)常量無法做到,且靜態(tài)常量只能限定類型球昨,不能限定值本身尔店。當(dāng)然在效率上,枚舉并不如靜態(tài)常量。

使用枚舉

創(chuàng)建一個枚舉類

一個枚舉值的變量名就是該值的名字嚣州,枚舉值在類中的定義順序就是該值的索引鲫售。

例:

enum WeekDay {
    Monday("Mon"), Tuesday("Tue"), Wednesday("Wed"), Thursday("Thu"),
    Friday("Fri"), Saturday("Sat"), Sunday("Sun");

    private String abbr;

    WeekDay(String abbr) {
        this.abbr = abbr;
    }

    public boolean isWorkingDay() {
        return !(this == Saturday || this == Sunday);
    }

    public String getAbbr() {
        return abbr;
    }
}

使用該枚舉類

//  直接獲得枚舉值
WeekDay mondy = WeekDay.Monday;

//  通過名字獲得枚舉
WeekDay monday = WeekDay.valueOf("Monday");
assert monday == WeekDay.Monday;

//  調(diào)用枚舉中的方法
assert WeekDay.Tuesday.isWorkingDay();
System.out.println(WeekDay.Thursday.getAbbr());

//  獲得一個枚舉值的索引
System.out.println(monday.ordinal());

//  通過索引獲得枚舉值
System.out.println(WeekDay.values()[0]);

在 Java 中,枚舉還有另一種用法该肴,就是創(chuàng)建單例類情竹。Java 中創(chuàng)建一個單例類通常需要做不少事情,還要考慮到線程的同步匀哄,而使用枚舉則完全不用考慮這些秦效。一般來說應(yīng)該盡量用枚舉來實現(xiàn)單例。

例:

enum Singleton {
    INSTANCE;
    private int count;
    public int sequence() {
        return ++count;
    }
}

使用該單例

Singleton.INSTANCE.sequence()

Groovy 篇

Groovy 中的枚舉基本與 Java 一樣涎嚼。

使用枚舉

創(chuàng)建一個枚舉類

enum WeekDay {
    Monday('Mon'), Tuesday('Tue'), Wednesday('Wed'), Thursday('Thu'),
    Friday('Fri'), Saturday('Sat'), Sunday('Sun')

    def abbr

    WeekDay(abbr) {
        this.abbr = abbr
    }

    def isWorkingDay() {
        !(this == Saturday || this == Sunday)
    }
}

使用該枚舉類

//  直接獲得枚舉值
def monday = WeekDay.Monday

//  通過名字獲得枚舉
def monday = 'Monday' as WeekDay
assert monday == WeekDay.Monday

//  調(diào)用枚舉中的方法
assert WeekDay.Tuesday.isWorkingDay()
println(WeekDay.Thursday.abbr)

//  獲得一個枚舉值的索引
println(monday.ordinal())

//  通過索引獲得枚舉值
println(WeekDay.values()[0])

同 Java 一樣阱州,Groovy 也可以通過枚舉構(gòu)建單例。

enum Singleton {
    INSTANCE
    def count = 0
    def sequence() {
        ++count
    }
}

使用該單例

println(Singleton.INSTANCE.sequence())

Scala 篇

嚴格來說铸抑,和其它語言不同贡耽,Scala 并沒有枚舉這種類型。Scala 中的枚舉值只是 Enumeration 下的 Value 類的實例鹊汛,而不是枚舉自身的實例蒲赂,而 Value 類的實例主要依靠其構(gòu)造方法的兩個值:idname 來構(gòu)建。其中 id 是自增長的刁憋,name 如果不指定時默認使用的就是值的名字滥嘴。所以不像其它語言,Scala 并不能任意定義構(gòu)造方法來構(gòu)造枚舉至耻。

使用枚舉

創(chuàng)建一個枚舉類

object WeekDay extends Enumeration {
  type WeekDay = Value
  val Monday = Value(100, "Mon")
  val Tuesday = Value("Tue")
  val Wednesday = Value
  val Thursday = Value("Thu")
  val Friday = Value("Fri")
  val Saturday = Value("Sat")
  val Sunday = Value("Sun")

  def isWorkingDay(d: WeekDay) {
    !(d == Saturday || d == Sunday)
  }
}

使用該枚舉類

//  直接獲得枚舉值
val monday = WeekDay.Monday

//  通過名字獲得枚舉
val monday = WeekDay.withName("Mon")
println(monday)

//  調(diào)用枚舉中的方法
println(WeekDay.isWorkingDay(WeekDay.Tuesday))

//  通過 id 獲得枚舉值
println(WeekDay(101))

//  獲取 id
println(monday.id)
println(WeekDay.Tuesday.id)

//  獲取 name
println(WeekDay.Thursday)
println(WeekDay.Wednesday)

Kotlin 篇

Kotlin 中的枚舉基本與 Java 一樣若皱。

使用枚舉

創(chuàng)建一個枚舉類

enum class WeekDay(val abbr: String) {
    Monday("Mon"), Tuesday("Tue"), Wednesday("Wed"), Thursday("Thu"),
    Friday("Fri"), Saturday("Sat"), Sunday("Sun");

    fun isWorkingDay(): Boolean {
        return !(this == Saturday || this == Sunday)
    }

}

使用該枚舉類

//  直接獲得枚舉值
val monday = WeekDay.Monday

//  通過名字獲得枚舉
val monday = WeekDay.valueOf("Monday")
println(monday)
println(monday.name)

//  調(diào)用枚舉中的方法
println(WeekDay.Tuesday.isWorkingDay())

//  獲得一個枚舉值的索引
println(monday.ordinal)

//  通過索引獲得枚舉值
println(WeekDay.values()[0])

Summary

  • 除了 Scala 之外,其它三種語言枚舉使用方法基本一致
  • Scala 沒有真正意義上的枚舉類型尘颓,也不能自定義構(gòu)造方法

文章源碼見 https://github.com/SidneyXu/JGSK 倉庫的 _24_enum 小節(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末走触,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子疤苹,更是在濱河造成了極大的恐慌互广,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卧土,死亡現(xiàn)場離奇詭異惫皱,居然都是意外死亡,警方通過查閱死者的電腦和手機尤莺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門旅敷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颤霎,你說我怎么就攤上這事媳谁⊥康危” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵韩脑,是天一觀的道長氢妈。 經(jīng)常有香客問我,道長段多,這世上最難降的妖魔是什么首量? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮进苍,結(jié)果婚禮上加缘,老公的妹妹穿的比我還像新娘。我一直安慰自己觉啊,他們只是感情好拣宏,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杠人,像睡著了一般勋乾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗡善,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天辑莫,我揣著相機與錄音,去河邊找鬼罩引。 笑死各吨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袁铐。 我是一名探鬼主播揭蜒,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剔桨!你這毒婦竟也來了屉更?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤洒缀,失蹤者是張志新(化名)和其女友劉穎偶垮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帝洪,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年脚猾,在試婚紗的時候發(fā)現(xiàn)自己被綠了葱峡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡龙助,死狀恐怖砰奕,靈堂內(nèi)的尸體忽然破棺而出蛛芥,到底是詐尸還是另有隱情,我是刑警寧澤军援,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布仅淑,位于F島的核電站,受9級特大地震影響胸哥,放射性物質(zhì)發(fā)生泄漏涯竟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一空厌、第九天 我趴在偏房一處隱蔽的房頂上張望庐船。 院中可真熱鬧,春花似錦嘲更、人聲如沸筐钟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篓冲。三九已至,卻和暖如春宠哄,著一層夾襖步出監(jiān)牢的瞬間壹将,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工琳拨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞭恰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓狱庇,卻偏偏與公主長得像惊畏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子密任,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理颜启,服務(wù)發(fā)現(xiàn),斷路器浪讳,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 前言 人生苦多缰盏,快來 Kotlin ,快速學(xué)習(xí)Kotlin淹遵! 什么是Kotlin口猜? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,176評論 9 118
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,778評論 6 342
  • Overview 類在面向?qū)ο缶幊讨惺且粋€最基本的概念。類是對象的模板透揣,用于產(chǎn)生具有相同結(jié)構(gòu)的對象济炎。一個類通常由屬...
    bookislife閱讀 923評論 0 0
  • 一年一度勞動節(jié),我果然熱愛勞動辐真。三天的勞動须尚,讓我累的不行不行的崖堤,可是,我還是活得好好的耐床。所以密幔,所有的痛苦都是會過去...
    小黃丫閱讀 176評論 0 0