前段时间有人问我:「你是怎么成为一名软件架构师的?」我们就此探讨了必备技能、经验,以及储备相关知识所需的时间和精力。除此之外,我也回顾了自己走过的路、使用或尝试过的技术,以及我从那些五花八门的工作中学到的东西。
//可以看到后续调用是直接用了上次的缓存结果
println(lazyValue)
}
非空属性: 适用于那些无法在初始化阶段确认属性值的场合。lateinit 修饰符只能在类(不在主构造函数中)内声明的var 属性上使用,而且只有在该属性没有自定义集合或者设置器时,此外属性的类型必须是非空的,并且不能是基元类型。而非空属性没有这些限制。其他他们的作用是相同的。如下是一个案例:
//【工匠若水 加微信 yanbo373131686 联系我,关注微信公众号:码农每日一题 未经允许严禁转载 https://blog.csdn.net/yanbober】
class Tree {
//非空属性解决了 var name: String? = null 导致后续判断冗余
//非空属性解决了 var name: String = “” 初值隐晦问题
//非空属性解决了 lateinit 的一些缺陷,譬如 lateinit 只能应用于非基元类型,譬如不能用于 Int 等问题
var name: String by Delegates.notNull()
}
/**
调用
*/
fun testRun() {
val tree = Tree()
//运行时异常,没有赋值而使用 IllegalStateException: Property name should be initialized before get.
//println(tree.name)
tree.name = “123”
println(tree.name)
}
可观测属性: kotlin 提供了 observable 赋值后观测器和 vetoable 赋值前拦截观测器的能力。如下是一个案例:
class Tree {
//可观测属性初值,10 是属性初值,当属性被赋值后会触发回调 lambada 表达式
var age: Int by Delegates.observable(10) {
property, oldValue, newValue ->
println(“property name is ${property.name}, old value is $oldValue, new value is $newValue”)
}
//可观测属性初值,10 是属性初值,当属性被赋值前会触发回调 lambada 表达式,可以做到类似属性值赋值拦截器的效果
//这里当赋值小于等于0则丢弃
var def