Kotlin入門-被簡化的 枚舉類(與java的差異)

在這裏插入圖片描述

前言

基本上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代碼量更少。簡潔的不要不要的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章