最近Kotlin触れてませんでした。少しずつでもいじらないと全部忘れてしまいそうなので(ほとんど忘れてるけど…)、最近のバージョンアップで加わったDelegate propertyについてのブログを読んでました。試しにサンプルコードを書いてみたのですが、Delegate property素晴らしい!よく不満に思っていた部分が解消されていました。
例えば、Hogeクラスではメンバ変数のpiyoを使うのだけれど、piyoはString型。しかし、初期化のためにString?型にしてnullで初期化せざるをえなかった。本当はnullなんか入れたくないのに…。という場合。
ここにコードがあるじゃろ?
package demo
class Hoge {
var piyo : String? = null // これが嫌い!
}
fun main(args : Array<String>) {
val hoge = Hoge()
hoge.piyo = "PIYOPIYO"
println(hoge.piyo?.toLowerCase) // 型がString?なのでnullの可能性があるから?が必要
}
これをこうして…
こうじゃ!
package demo
class Hoge {
var piyo : String by Delegates.notNull()
}
fun main(args : Array<String>) {
val hoge = Hoge()
hoge.piyo = "PIYOPIYO"
println(hoge.piyo.toLowerCase) // 型がStringなのでnullの可能性がない!
}
これで不満が一つ解消された。
あと、Delegates.mapValが追加されてた。
これはjsonのデータをパースしてそのままインスタンスにする場合に使える。
package demo
class User(map : Map<String, Any?>) {
val name: String by Delegates.mapVal(map)
val age: Int by Delegates.mapVal(map)
}
fun main(args : Array<String>) {
val user = User(mapOf(
"name" to "John Doe",
"age" to 25
))
println(user.name)
println(user.age)
}
これもよさそう。あとはDelegates.lazy{}もあった。
これも使えそうだ。
