Kotlinの列挙型と内部クラス
※英語、または技術的な知識が至らず、内容に誤りが含まれるおそれがありますので、ご了承ください。
列挙型のクラス
参考サイト http://confluence.jetbrains.net/display/Kotlin/Enum+classes
列挙型クラスの最も基本的な使い方は、Javaのような型安全列挙型を実装することです。
enum class Color { RED; GREEN; BLUE; }
Kotlinでは至る所でセミコロンを省略できます。
enum class Color { RED GREEN BLUE }
openな列挙型
Kotlinでは列挙型をopen宣言できます。つまり、他の列挙型によってサブクラス化できるのです。
列挙型はトレイトも同様に拡張できます。
列挙型定数はオブジェクトである
列挙型の定数は、列挙型クラスのそれぞれ異なったインスタンスです。したがって、それらは異なるように初期化できます。
enum class Color(val rgb : Int) { RED : Color(0xFF0000) GREEN : Color(0x00FF00) BLUE : Color(0x0000FF) }http://confluence.jetbrains.net/display/Kotlin/Enum+classesより引用
列挙型定数は(匿名)クラスを定義する
各列挙型定数は、自身のメンバを宣言したり、列挙型クラスのメンバをオーバライドできます。
enum class ProtocolState { WAITING { override fun signal() = TALKING } TALKING { override fun signal() = WAITING } abstract fun signal() : ProtocolState }http://confluence.jetbrains.net/display/Kotlin/Enum+classesより引用
列挙型クラスにおけるコンストラクタ
列挙型は実際に(汎用的)代数データ型(Algebraic Data Types)をエンコードするため、定数の代わりに名前付きコンストラクタを持つ場合もあります。
enum class List<out T>(val size : Int) { Nil : List<Nothing>(0) Cons<T>(h : T, t : List<T>) : List<T>(t.size + 1) }http://confluence.jetbrains.net/display/Kotlin/Enum+classesより引用
内部クラス
参考サイト http://confluence.jetbrains.net/display/Kotlin/Inner+classes
内部クラス(inner class)は他のクラスにネストされたクラスです。内部クラスは外側のクラスのすべてのメンバにアクセスできます。
class Outer() { private val bar : Int = 1 class Inner() { fun foo() = bar } } val demo = Outer().Inner().foo() // == 1http://confluence.jetbrains.net/display/Kotlin/Inner+classes より引用