KotlinDive

プログラミング言語 Kotlin についての入門ブログです。

クラス(列挙型)

列挙型の使い方

列挙型の最も基本的な使い方は次のようになります。

 fun main(args: Array) {
    printState(State.Run)
}

// 列挙型の宣言
enum class State {
    Stop, Run, Suspend
}

fun printState(state: State) = when(state) {
    State.Stop-> println("Stop")
    State.Run -> print("Run")
    State.Suspend -> println("Suspend")
}
 Run

列挙型のそれぞれの要素を初期化したい場合は次のようにします。

 fun main(args: Array) {
    // 予め用意されているメンバーもあります
    println(State.Run.name)

    println(State.Run.desc)
}

// 列挙型の初期化
// コンストラクタを宣言して、各要素の宣言時に値を渡す
enum class State(val desc: String) {
    Stop("Stop state. This is Initial State."),
    Run("Run state. Something is running."),
    Suspend("Suspend state. This can resume immideately.")
}
 Run
Run state. Something is running.

要素ごとに個別の処理を実装する

Kotlinの列挙型では、それぞれの要素をその列挙型を継承した匿名クラスのように実装することができます。
そうすることで、その列挙型の各要素に、それぞれの要素ごとの処理をわかりやすく実装することができます。 次のサンプルを見てましょう。

 fun main(args: Array) {
    var state = State.Stop

    println(state.name)
    state = state.trans(true, false)
    println(state.name)
    state = state.trans(false, true)
    println(state.name)
    state = state.trans(true, false)
    println(state.name)
    state = state.trans(true, false)
    println(state.name)
}

enum class State() {
    // Stop要素をState列挙型を継承した匿名クラスのように実装する
    Stop {
        // 基底クラスであるStateのメンバーであるtransをオーバーライドする
        override fun trans(isRunBottunPressed: Boolean, isSuspendButtonPressed: Boolean): State {
            if (isRunBottunPressed) {
                // 停止中に実行ボタンが押されたら実行する
                return Run
            }

            // 停止中に一時停止ボタンが押されてもなにもしない

            return Stop
        }
    },

    Run {
        override fun trans(isRunBottunPressed: Boolean, isSuspendButtonPressed: Boolean): State {
            if (isRunBottunPressed) {
                // 実行中に再度実行ボタンを押すと停止する
                return  Stop
            }

            if (isSuspendButtonPressed) {
                // 実行中に一時停止ボタンを押すと一時停止する
                return Suspend
            }

            return Run
        }
    },

    Suspend {
        override fun trans(isRunBottunPressed: Boolean, isSuspendButtonPressed: Boolean): State {
            if (isRunBottunPressed) {
                // 一時停止中に実行ボタンを押すと、再開する
                return Run
            }

            // 一時停止中にもう一度一時停止ボタンを押しても何もおこらない

            return Suspend
        }
    };

    abstract fun trans(isRunBottunPressed: Boolean, isSuspendButtonPressed: Boolean): State
}
 Stop
Run
Suspend
Run
Stop