(Kotlin 1.0) sealed class Color { object Red : Color() object Green : Color() object Blue : Color() class RGB(val r: Int, val g: Int, val b: Int) : Color() }
(Kotlin 1.0) sealed class Color { object Red : Color() object Green : Color() object Blue : Color() class RGB(val r: Int, val g: Int, val b: Int) : Color() } 4JOHMFUPOΦϒδΣΫτ ͻͱͭͷΛද͢
(Kotlin 1.0) sealed class Color { object Red : Color() object Green : Color() object Blue : Color() class RGB(val r: Int, val g: Int, val b: Int) : Color() } ҾΛ࣋ͭΫϥε ͋Δू߹Λද͢
(Kotlin 1.0) sealed class Color { object Red : Color() object Green : Color() object Blue : Color() class RGB(val r: Int, val g: Int, val b: Int) : Color() } 代数的データ型(直和型) - 互いに交わらない集合の和 - これ以外の値をもたない (厳密には上記Color型は直和型ではない)
(Kotlin 1.0) sealed class Color { object Red : Color() object Green : Color() object Blue : Color() class RGB(val r: Int, val g: Int, val b: Int) : Color() } // ΦϒδΣΫτͲ͏͠Λൺֱ͢Δ val b = Color.RGB(0,0,0) == Color.RGB(0,0,0) b => false
(Kotlin 1.0) sealed class Color { object Red : Color() object Green : Color() object Blue : Color() class RGB(val r: Int, val g: Int, val b: Int) : Color(){ override fun equals(other: Any?): Boolean { if (this === other) return true if (other?.javaClass != javaClass) return false other as RGB if (r != other.r) return false if (g != other.g) return false if (b != other.b) return false return true } override fun hashCode(): Int { var result = r result = 31 * result + g result = 31 * result + b return result } } }
(Kotlin 1.1) sealed class Color object Red : Color() object Green : Color() object Blue : Color() class RGB(val r: Int, val g: Int, val b: Int) : Color() - sealed class のサブクラスをトップレベルに記述できる - sealed class のサブクラスは親クラスと同じファイル上 に定義する必要がある。
(Kotlin 1.1) sealed class Color object Red : Color() object Green : Color() object Blue : Color() class RGB(val r: Int, val g: Int, val b: Int) : Color() fun value(color: Color) = when(color){ Red -> "#FF0000" Green -> "#FF0000" Blue -> "#FF0000" is RGB ->"#%02X%02X%02X".format(color.r, color.g, color.b) } スッキリ!
(Kotlin 1.1) sealed class Color object Red : Color() object Green : Color() object Blue : Color() data class RGB(val r: Int, val g: Int, val b: Int) : Color()
(Kotlin 1.1) sealed class Color object Red : Color() object Green : Color() object Blue : Color() data class RGB(val r: Int, val g: Int, val b: Int) : Color() data class - data classが親クラスをもつことができる - sealed class の⼦クラスとしてdata classを定義できる
(Kotlin 1.1) sealed class Color object Red : Color() object Green : Color() object Blue : Color() data class RGB(val r: Int, val g: Int, val b: Int) : Color() // ΦϒδΣΫτͲ͏͠Λൺֱ͢Δ val b = RGB(0,0,0) == RGB(0,0,0) b => true
(Kotlin 1.1) sealed class Color object Red : Color() object Green : Color() object Blue : Color() data class RGB(val r: Int, val g: Int, val b: Int) : Color() fun value(color: Color) = when(color){ Red -> "#FF0000" Green -> "#FF0000" Blue -> “#FF0000" RGB(0,0,0) -> “#000000” is RGB ->"#%02X%02X%02X".format(color.r, color.g, color.b) }
(Kotlin 1.1) sealed class Color object Red : Color() object Green : Color() object Blue : Color() data class RGB(val r: Int, val g: Int, val b: Int) : Color() fun value(color: Color) = when(color){ Red -> "#FF0000" Green -> "#FF0000" Blue -> “#FF0000" RGB(0,0,0) -> “#000000” is RGB ->"#%02X%02X%02X".format(color.r, color.g, color.b) }
(Kotlin 1.1) sealed class Color object Red : Color() object Green : Color() object Blue : Color() data class RGB(val r: Int, val g: Int, val b: Int) : Color() val (r, g, b) = RGB(0, 0, 0) data class の Destructuring Declarations
(Kotlin 1.1) sealed class Color object Red : Color() object Green : Color() object Blue : Color() data class RGB(val r: Int, val g: Int, val b: Int) : Color() fun value(color: Color) = when(color){ Red -> "#FF0000" Green -> "#FF0000" Blue -> “#FF0000" is RGB -> { val (r, g, b) = color “#%02X%02X%02X".format(r, g, b) } } ちょっとパターンマッチっぽい (あと⼀歩!)
(Kotlin 1.1) sealed class Color object Red : Color() object Green : Color() object Blue : Color() data class RGB(val r: Int, val g: Int, val b: Int) : Color() fun value(color: Color) = when(color){ Red -> "#FF0000" Green -> "#FF0000" Blue -> “#FF0000" is RGB -> color.let { (r, g, b) -> “#%02X%02X%02X".format(r, g, b) } } Destructuring in Lambdas (since 1.1)