基本上Java是一样的。下面的几个点java也都提供
它实现一个类型安全的枚举。
总体上说,Kotlin的枚举跟Java的枚举是基本相同的。差异主要在代码量上。
enum class Color{
RED,BLACK,BLUE,GREEN,WHITE
}
我们再来看下java的实现。
public enum Color {
RED,BLACK,BLUE,GREEN,WHITE
}
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;
}
}
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
java和Kotlin功能上是都可以实现的。无非就是Kotlin代码量更少。
还支持以声明自己的匿名类及相应的方法、以及覆盖基类的方法
public enum ProtocolState {
WAITING{
@Override
public ProtocolState signal() {
return TALKING;
}
},
TALKING{
@Override
public ProtocolState signal() {
return WAITING;
}
};
//抽象方法,由枚举对象实现
public abstract ProtocolState signal();
}
enum class ProtocolState {
WAITING {
override fun signal() = TALKING
},
TALKING {
override fun signal() = WAITING
};
abstract fun signal(): ProtocolState
}
这部分也是一样的,类似的代码,只是代码更少。
在Kotlin中,除了实现自身接口,还可以实现外部接口。
在相应匿名类中为每个条目提供各自的实现。
import java.util.function.BinaryOperator
import java.util.function.IntBinaryOperator
enum class IntArithmetics : BinaryOperator, 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 //获取枚举值在所有枚举数组中定义的顺序
允许遍历定义的枚举常量;
for(ColorEnum temp:ColorEnum.values()){
System.out.println(temp);
}
EnumClass.values(): Array// 以数组的形式,返回枚举值
并通过其名称获取枚举常数
在java中是这样的
ColorEnum.valueOf("RED");
在Kotlin中是这样的
EnumClass.valueOf(value: String): EnumClass
// 转换指定 name 为枚举值,若未匹配成功,会抛出IllegalArgumentException
可以看出来,Java有的功能,Kotlin也都有实现。
无非就是Kotlin代码量更少。简洁的不要不要的。