【学習kotlinシリーズ】イニシャライザ

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

Qiitaでことりん学習帳を発売しています!

イニシャライザとは

イニシャライザとは、インスタンス生成時に行いたい処理をまとめて定義しておくこと。例えば、
コンストラクタで受け取った値などをチェックし、チェックに引っかかった場合はエラーを投げる
といったことができる。

イニシャライザの書き方

イニシャライザはclassの中に次のように書く。

class クラス名(){
    init{
        // 処理
    }
}

実際に書いてみる

MyGameクラスのコンストラクタで、HPが0以下の値を設定するとエラーを吐くようにした。

// コンストラクタを設定
class MyGame(_hp: Int, _mp: Int){

    // イニシャライザでHPより大きくないとキャラクターを作成できないようにしておく
    init{
        require(_hp > 0)
    }

    // セカンダリコンストラクタ
    constructor(_hp: Int, _mp: Int, _name: String): this(_hp, _mp){
        hp = _hp
        mp = _mp
        name = _name
    }

    // プロパティを定義
    var hp: Int = _hp
    var mp: Int = _mp

    // カスタムセッターを定義
    var name: String = ""
        set(value) {
            println("nameに${value}が設定されました。")
            // 値は field変数に格納する
            field = value
        }

    // カスタムゲッターを定義
    val nameLength: Int
        get(): Int {
            return this.name.length
        }


    // メソッドを定義
    fun getHP(): Int {
        return this.hp
    }

    fun getMP(): Int {
        // this は省略できる
        return mp
    }
}

fun main(args: Array<String>){

    // MyGameインスタンスの作成
    val hero: MyGame = MyGame(100, 20)

    // プロパティを設定
    hero.name = "John"

    // メソッドを実行
    print("現在のHP: ")
    println(hero.getHP())
    print("現在のMP: ")
    println(hero.getMP())
    print("名前の長さ: ")

    // カスタムゲッターで名前の長さを取得
    println(hero.nameLength)


    // セカンダリコンストラクタを利用してモンスターを作成
    val monster: MyGame = MyGame(200, 10, "umentu")

    // モンスターのステータスを表示
    print("モンスターの名前: ")
    println(monster.name)
    print("モンスターのHP: ")
    println(monster.getHP())
    print("モンスターのMP: ")
    println(monster.getMP())

    // イニシャライザでひっかかるキャラクターを作成
    val knight: MyGame = MyGame(0, 20)
}

実行結果

Exception in thread "main" java.lang.IllegalArgumentException: Failed requirement.
    at MyGame.<init>(cls.kt:10)
    at ClsKt.main(cls.kt:81)

Related posts

コメントを残す