エクスカリバーの謎

Kotlinってカテゴリーを作っても良かったんだけど、
Androidアプリを書くためにお勉強してるから、増やさない方向で。

最近、読み始めたんだけど、そろそろ中盤です。

クラス定義の次の13章「初期化」の章末問題は、
手を動かさないとわからなかったので。

class Sword(_name: String) {
    var name = _name
        get() = "The Legendary $field"
        set(value) {
            println("setter")
            field = value.toLowerCase().reversed().capitalize()
        }

    init {
        println("init")
        println(name)
        name = _name // <- setter
        println(name)
    }
}

fun main(args: Array) {
    val sword = Sword("Excalibur")
    println(sword.name)
}

$ kotlinc hello.kt -include-runtime -d hello.jar
$ kotlin hello.jar
init
The Legendary Excalibur
setter
The Legendary Rubilacxe
The Legendary Rubilacxe

メンバー定義での代入は初期化扱い、
initブロックでの代入はセッター経由、
セッター経由ということは、プロパティとして機能している。

Swiftも初期化ではdidSet呼ばれないよね、
みたいな解釈で良いですかね(Swift脳)。

おしまい。

Leave a Comment