在为 android 开发时,我有时会遇到如下情况:
var someModel: someViewModel by notNullAndObservable { vm -> ... }
我不明白by关键字的意义是什么。
by
在Kotlin 参考中,您会发现 的两个用途by,第一个是委托属性,这是您在上面的用途:
有一些常见的属性,虽然我们可以在每次需要它们时手动实现它们,但一劳永逸地实现它们并放入库中会非常好。示例包括惰性属性:仅在首次访问时计算值,可观察属性:侦听器收到有关此属性更改的通知,将属性存储在地图中,而不是每个单独的字段中。
在这里,您将 getter/setter 委托给另一个完成工作并且可以包含公共代码的类。作为另一个例子,Kotlin 的一些依赖注入器通过委托 getter 从依赖注入引擎管理的实例注册表中接收值来支持此模型。
接口/类委托是另一种用途:
委托模式已被证明是实现继承的一个很好的替代方案,并且 Kotlin 本身就支持它,需要零样板代码。Derived 类可以从接口 Base 继承并将其所有公共方法委托给指定对象
在这里,您可以将接口委托给另一个实现,因此实现类只需要覆盖它想要更改的内容,而其余方法则委托回更完整的实现。
一个活生生的例子是Klutter 只读/不可变集合,它们实际上只是将特定集合接口委托给另一个类,然后覆盖只读实现中需要不同的任何内容。无需手动委托所有其他方法即可节省大量工作。
Kotlin 语言参考 中涵盖了这两者 ,从那里开始了解该语言的基本主题。