====== 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}}