【发布时间】:2017-12-22 21:59:57
【问题描述】:
我想对var 属性进行延迟初始化。由于by lazy 仅限于val 属性,因此我必须编写如下内容:
private var currentContextProvider: ContextProvider? = null
get() {
if (field == null) {
field = DefaultContextProvider()
}
return field
}
现在我必须处理那些 无意义 可空性感知调用:currentContextProvider?.getContext() 或 currentContextProvider!!.getContext()
我做错了吗?
【问题讨论】:
-
听起来您对正在发生的两件事感兴趣:
nullability和initialization。您的变量必须可以为空吗?是否要初始化此项目一次且仅一次?另外,你为什么要var而不是val? -
我相信有人会发布关于如何实现自定义委托的代码,但我无法想象任何现实生活中的情况,您需要在不影响封装的情况下修改惰性属性
-
@dkarmazi 我创建了一个默认策略是
DefaultContextProvider。这就是我使用var而不是val的原因,所以我可以在运行时更改它。我还想提供一个存根策略(不是模拟整个班级)并测试所有东西。我的测试依赖项与 prod 依赖项区分开来,因此当它到达DefaultContextProvider()时会引发错误。这就是惰性初始化的原因。在对此类进行任何调用之前,我在onSetup中设置了存根策略,一切正常,除非我必须处理可空性感知问题。