====== 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) } {{:kotlin:pasted:20191210-080738.png}}