発端は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())