Kotlin:检查是否已经初始化了val

有没有一种方法可以判断一个懒惰的val是否已经在Kotlin中初始化了,而没有在这个过程中初始化呢?

例如,如果我有一个惰性val,查询是否为null将实例化它

val messageBroker: MessageBroker by lazy { MessageBroker() } if (messageBroker == null) { // oops } 

我可能使用第二个变量,但似乎凌乱。

 private var isMessageBrokerInstantiated: Boolean = false val messageBroker: MessageBroker by lazy { isMessageBrokerInstantiated = true MessageBroker() } ... if (!isMessageBrokerInstantiated) { // use case } 

是否有一些性感的方式来确定这个,就像if (Lazy(messageBroker).isInstantiated())

相关(但不一样): 如何检查“lateinit”变量是否已被初始化?

有一种方法,但你必须访问由lazy {}返回的委托对象:

 val messageBrokerDelegate = lazy { MessageBroker() } val messageBroker by messageBrokerDelegate if(messageBrokerDelegate.isInitialized()) ... 

isInitialized是接口Lazy<T>上的公共方法,这里是文档 。

自Kotlin 1.1以来,您可以使用.getDelegate()直接访问属性委托。

你可以为一个属性引用编写一个扩展函数来检查它是否有一个已经被初始化的Lazy委托:

 fun <T> KProperty0<T>.isInitialized(): Boolean { isAccessible = true return (getDelegate() as? Lazy<*>)?.isInitialized() ?: true } 

然后在使用地点:

 val messageBroker: MessageBroker by lazy { MessageBroker() } if (this::messageBroker.isInitialized()) { // ... } 

这个解决方案需要kotlin-reflect在类路径上。 用Gradle,使用
compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"

.getDelegate()需要isAccessible = true部分,否则无法访问存储委托引用的专用字段。