Kotlin入门-被简化的 枚举类(与java的差异)

Kotlin入门-被简化的 枚举类(与java的差异)_第1张图片

前言

基本上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, 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// 以数组的形式,返回枚举值

并通过其名称获取枚举常数
在java中是这样的

ColorEnum.valueOf("RED");

在Kotlin中是这样的

EnumClass.valueOf(value: String): EnumClass
// 转换指定 name 为枚举值,若未匹配成功,会抛出IllegalArgumentException

小结

可以看出来,Java有的功能,Kotlin也都有实现。
无非就是Kotlin代码量更少。简洁的不要不要的。

你可能感兴趣的:([kotlin],Kotlin,java,枚举,enum,差异)