目次

enumとsealed

enumクラス

GEARクラスのLOW,MIDDLE,HIというインスタンスということを宣言している。

enumの基本

enum class GEAR(){
    LOW,
    MIDDLE,
    HI
}
fun main(){
    println(GEAR.HI)
}
 ↓
HI

enumのコンストラクタ

enum class GEAR(val speed:Int){ // クラスなのでコンストラクタにプロパティの宣言ができる。
    LOW(10),
    MIDDLE(60),
    HI(100)
}
fun main(){
    println(GEAR.HI.speed)
}
 ↓
100

enumの関数宣言

enum class GEAR(val speed:Int){
    LOW(10),
    MIDDLE(60),
    HI(100); // 「;」で区切る
    // クラスなので関数宣言ができる
    fun Accelerator(){ 
        println(speed)
    }
}
fun main(){
    GEAR.HI.Accelerator()
}
 ↓
100

enumのは代数的データ型(ADT)

代数的データ型(Algebraic data type)とは、その型に割当可能なサブタイプの閉集合を表現できる複合型。
GEARはLOW,MIDDLE,HIという閉集合を表現している。
つまりGEARは3つの値しかない。

通常下記のような場合はELSEがなければコンパイルエラーとなるが、
ELSEがなくても3つの条件をつければコンパイルが通る。
(コンパイラーは3つしか条件がないことをわ分かっている。=閉集合)

enum class GEAR(val speed:Int){
    LOW(10),
    MIDDLE(60),
    HI(100);
}

class CAR(val gear: GEAR){
}

fun main(){
    val civic = CAR(GEAR.MIDDLE)
    // LOW,MIDDLE,HI全てを条件にするかELSEがなければエラーになる。
    val message  = when (civic.gear){ 
        GEAR.LOW -> "too slow"
//        GEAR.MIDDLE -> "just right" // コメントをはずせばELSE不要
//        GEAR.HI -> "too fast" // コメントをはずせばELSE不要
    }
    println(message)
}