Derived继承 Base 接口,指定 b对象代理实现全部的公共方法,b存储在 Derived实例对象内部。
lateinit 和 by lazy区别: 1.lazy{} 只能用val类型, lateinit 只能用var类型 2.lateinit不能用在可空的属性上和基本类型上
Delegates.observable() 函数接受两个参数: 第一个是初始化值, 第二个是属性值变化事件的响应器(handler)。在属性赋值后会执行事件的响应器(handler),它有三个参数:被赋值的属性、旧值和新值:
import kotlin.properties.Delegates class User{ var name:String by Delegates.observable("初始值"){ prop,old,new-> println("旧值:$old->新值:$new") } } fun main(args: Array<String>) { val user=User() user.name="第一次赋值" user.name="第二次赋值" } //输出结果 旧值:初始值->新值:第一次赋值 旧值:第一次赋值->新值:第二次赋值如果使用 var 属性,需要把 Map 换成 MutableMap:
class Site(val map: MutableMap<String, Any?>) { val name: String by map val url: String by map } fun main(args: Array<String>) { var map:MutableMap<String, Any?> = mutableMapOf( "name" to "菜鸟教程", "url" to "www.runoob.com" ) val site = Site(map) println(site.name) println(site.url) println("--------------") map.put("name", "Google") map.put("url", "www.google.com") println(site.name) println(site.url) } //打印结果 菜鸟教程 www.runoob.com -------------- Google www.google.comnotNull 适用于那些无法在初始化阶段就确定属性值的场合。 注意:如果属性在赋值前就被访问的话则会抛出异常。
class Foo { var notNullBar: String by Delegates.notNull<String>() } foo.notNullBar = "bar" println(foo.notNullBar)