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)造方法的兩個值:id
和 name
來構(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é)