Kotlin中的“by”关键字做了什么?

Kotlin中的“by”关键字做了什么? 我有时遇到这样的事情看起来像这样,而为Android的发展:

var someModel: someViewModel by notNullAndObservable { vm -> ... } 

我不明白“by”关键字的意义是什么。

在Kotlin的参考资料中,您会发现by两个用法,第一个是Delegated Properties ,这是您在上面的用法:

有一些常见的属性,虽然我们可以在需要的时候手动实现,但是一劳永逸的实现,并将其放到一个库中是非常好的。 示例包括惰性属性:只在第一次访问时计算值,可观察属性:侦听器将获得有关对此属性所做更改的通知,将属性存储在地图中,而不是分别放在单独的字段中。

在这里,将getter / setter委托给另一个可以包含通用代码的类。 作为另一个例子,Kotlin的一些依赖注入器通过将getter委派给从依赖注入引擎管理的实例的注册表中接收一个值来支持这个模型。

而接口/类委托是另一个用途:

委托模式已经被证明是实现继承的一个很好的选择,而Kotlin在本地支持它需要零代码。 Derived类可以继承自Base接口并将其所有公共方法委托给指定的对象

在这里,你可以委托一个接口到另一个实现,所以实现类只需要重写它想要改变的东西,而其余的方法委托给一个更全面的实现。

一个活的例子就是Klutter Readonly / Immutable集合 ,他们真的只是将特定的集合接口委托给另一个类,然后重写readonly实现中需要不同的任何东西。 节省大量的工作,而不必手动委托所有其他方法。

Kotlin语言参考涵盖了这两个部分 ,从那里开始了该语言的基本主题。