最近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{}もあった。
これも使えそうだ。