算譜王におれはなる!!!!

偏りはあると思うけど情報技術全般についてマイペースに書くよ。

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() // == 1

http://confluence.jetbrains.net/display/Kotlin/Inner+classes より引用