LoginSignup
2
0

More than 3 years have passed since last update.

[Kotlin豆知識] KProperty<T, out R>は関数のようにふるまう

Last updated at Posted at 2019-05-23

発端はEnumから

enumのメンバをそのプロパティから復元するときにこういうコードをよく書く。

enum class Moge(val raw: Int) {
    companion object {
        private val map = values().associateBy(Moge::raw)

        fun fromInt(value: Int) : Moge {
            return map[value] ?: throw IllegalArgumentException("Moge!!!")
        }
}

丁寧に挙動を調べてやると、 Hoge::fuga はHogeのインスタンスを引数にとる関数のような挙動をすることがわかる。

class Hoge(val fuga: Int = 3) 
val fuga = (Hoge::fuga)(Hoge())

fugaをprivateにすると

きちんとコンパイルエラーになってくれる

class Hoge(private val fuga: Int = 3)

// fugaのprivate性はここで検知される
val fuga = Hoge::fuga
fuga(Hoge())

何の意味もないが

KProperty1をムリヤリ外に出してやると、プライベートメンバにアクセスができる。

class Hoge(private val fuga: Int = 3) {
    companion object {
        fun fugaProperty(): KProperty1<Hoge, Int> {
            return Hoge::fuga
        }
    }
}
val fugaProperty = Hoge.fugaProperty()
val fuga = fugaProperty(Hoge())
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0