kotlin 实战之委托总结,再不了解你就out啦

前段时间有人问我:「你是怎么成为一名软件架构师的?」我们就此探讨了必备技能、经验,以及储备相关知识所需的时间和精力。除此之外,我也回顾了自己走过的路、使用或尝试过的技术,以及我从那些五花八门的工作中学到的东西。

//可以看到后续调用是直接用了上次的缓存结果

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值