前言
基本上Java是一樣的。下面的幾個點java也都提供
它實現一個類型安全的枚舉。
總體上說,Kotlin的枚舉跟Java的枚舉是基本相同的。差異主要在代碼量上。
初始化
無參數的枚舉類型
enum class Color{
RED,BLACK,BLUE,GREEN,WHITE
}
我們再來看下java的實現。
public enum Color {
RED,BLACK,BLUE,GREEN,WHITE
}
java的枚舉有幾個特點
- 沒有class關鍵字
- 非抽象的枚舉類默認使用final修飾,不可以被繼承;
- 構造函數只能是私有的。
傳參數的枚舉類型
看java部分
public enum Color {
RED(0xFF0000),GREEN(0x00FF00),GREEN(0x0000FF); //需要添加分號
private final int color;
private Color(int color) {
color = color;
}
public String getColor() {
return color;
}
}
看Kotlin部分
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
java和Kotlin功能上是都可以實現的。無非就是Kotlin代碼量更少。
匿名類
還支持以聲明自己的匿名類及相應的方法、以及覆蓋基類的方法
現在來看下Java的範例
public enum ProtocolState {
WAITING{
@Override
public ProtocolState signal() {
return TALKING;
}
},
TALKING{
@Override
public ProtocolState signal() {
return WAITING;
}
};
//抽象方法,由枚舉對象實現
public abstract ProtocolState signal();
}
先看下Kotlin的範例
enum class ProtocolState {
WAITING {
override fun signal() = TALKING
},
TALKING {
override fun signal() = WAITING
};
abstract fun signal(): ProtocolState
}
這部分也是一樣的,類似的代碼,只是代碼更少。
Kotlin還可以實現外部接口
在Kotlin中,除了實現自身接口,還可以實現外部接口。
在相應匿名類中爲每個條目提供各自的實現。
範例
import java.util.function.BinaryOperator
import java.util.function.IntBinaryOperator
enum class IntArithmetics : BinaryOperator<Int>, IntBinaryOperator {
PLUS {
override fun apply(t: Int, u: Int): Int = t + u
},
TIMES {
override fun apply(t: Int, u: Int): Int = t * u
};
override fun applyAsInt(t: Int, u: Int) = apply(t, u)
}
fun main() {
val a = 13
val b = 31
for (f in IntArithmetics.values()) {
println("$f($a, $b) = ${f.apply(a, b)}")
}
}
//BinaryOperator 有apply函數
//IntBinaryOperator 有applyAsInt函數
輸出結果:
PLUS(13, 31) = 44
TIMES(13, 31) = 403
使用枚舉常量
獲取枚舉相關信息:
val name: String //獲取枚舉名稱
val ordinal: Int //獲取枚舉值在所有枚舉數組中定義的順序
具有合成方法
允許遍歷定義的枚舉常量;
在Java中是這樣的
for(ColorEnum temp:ColorEnum.values()){
System.out.println(temp);
}
在Kotlin中是這樣的
EnumClass.values(): Array<EnumClass>// 以數組的形式,返回枚舉值
並通過其名稱獲取枚舉常數
在java中是這樣的
ColorEnum.valueOf("RED");
在Kotlin中是這樣的
EnumClass.valueOf(value: String): EnumClass
// 轉換指定 name 爲枚舉值,若未匹配成功,會拋出IllegalArgumentException
小結
可以看出來,Java有的功能,Kotlin也都有實現。
無非就是Kotlin代碼量更少。簡潔的不要不要的。