Kotlin学习笔记系列:http://blog.csdn.net/column/details/16696.html
class Delegate : ReadWriteProperty{
override fun getValue(thisRef: Any?, property: KProperty<*>): T{
return ...
}
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T){
...
}
}
其中T是委托属性的类型,getValue接收一个类的引用和一个属性的元数据,setValue多接收一个设置的值。
class Example {
var p: String by Delegate()
}
class App : Application{
val database: SQLiteOpenHelper by lazy{
MyDatabaseHelper(applicationContext)
}
override fun onCreate(){
super.onCreate()
var db = database.writableDatabase
}
}
所以只要当在onCreate中使用时才去初始化,而这时候applicationContext已经存在了。
class ViewModel(val db: MyDatabase){
var name by Delegates.observable(""){
d, old, new -> db.saveChange(this, new)
}
}
这个例子中一旦值被修改就会保存到数据库中。
var name by Delegates.vetoable(0){
d, old, new -> new >= 0
}
例子中表示只有新值是正数时才保存
class Config (map: HashMap){
var name: String by map
var id: Int by map
}
var config = Config(hashMapOf(
"name" to "test",
"id" to 12
))
object DelegatesExt{
fun notNullSingle() : ReadWriteProperty = NotNullSingle() //NotNullSingle是我们自定义的委托
}