懒加载
kotlin懒加载有两种方式,lateinit var 和 lazy。
lateinit var懒加载初始化
lateinit var 懒加载方式,有几点需要注意
需要手动初始化,但是可以初始化多次,也就是该值可以改变
只能用于不可null的对象,不能为primitives(Int、Float之类)类型
同时我个人觉得也会带来一些好处
对于类似android的activity而言,某些在初始化的时候不能确定该值,只有在某些特定方法调用的时候才可以确定值的情况下,才能进行其初始化。常见onCreate初始化
对于第一点而言,可以有效的避免?号或者!!的大量使用影响阅读或者强迫证的人
这两点优势,我个人觉得还是很不错的。下面的例子
lazy初始化方法
Lazy是一个接口,lazy是一个方法,返回一个Lazy对象。kotlin默认已经实现了常用的Lazy对象。lazy只能修饰val类型
lazy方法是真正的懒加载方法,它要使用者提供初始化过程,在第一次调用的时候会进行初始化。lazy所有的内容都Layz.kt里。
系统默认有三个Lazy的实现类。具体可以看下代码。
这里有个疑问,默认的lazy 方法只会进行一次的初始化,但是这个是系统实现的,如果自己实现Lazy接口呢?是否可以根据其他不同的变量返回不同的值呢?看下例子
~通过结果可以看出,是可以实现出不同的对象。所以说虽然user是val类型,但是可以改变其值的
代理ReadWriteProperty
属性代理,从抽象来说,就是hook属性的get和set方法,加入自身需要的逻辑和内容。一个很好的实践例子就是两个view的显示的状态跟随某个boolean变量切换。
省略部分代码
上面例子中,trueView和falseView的显示和隐藏会随着status变量的改变而改变。
整个代理看起来,有点像databinding,vue和react的状态机。例如还可以设置个String类型的content变量,绑定到一个textView中。
结束
kotlin的代理机制和懒加载机制是kotlin比较常用的技术,尤其是代理,应该多加的练习和实践,可以创造出很多有意思的东西
领取专属 10元无门槛券
私享最新 技术干货