首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Kotlin:检查lazy val是否已初始化

Kotlin:检查lazy val是否已初始化
EN

Stack Overflow用户
提问于 2017-03-01 11:38:52
回答 2查看 13.5K关注 0票数 54

有没有办法在Kotlin中判断一个lazy val是否已经被初始化,而不需要在进程中初始化它?

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

代码语言:javascript
复制
val messageBroker: MessageBroker by lazy { MessageBroker() }
if (messageBroker == null) {
    // oops
}

我可以潜在地使用第二个变量,但这看起来很混乱。

代码语言:javascript
复制
private var isMessageBrokerInstantiated: Boolean = false
val messageBroker: MessageBroker by lazy {
    isMessageBrokerInstantiated = true
    MessageBroker()
}

...

if (!isMessageBrokerInstantiated) {
    // use case
}

有没有什么很吸引人的方式来确定这一点,比如if (Lazy(messageBroker).isInstantiated())

相关(但不相同):How to check if a "lateinit" variable has been initialized?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-01 14:12:04

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

代码语言:javascript
复制
val messageBrokerDelegate = lazy { MessageBroker() }
val messageBroker by messageBrokerDelegate

if(messageBrokerDelegate.isInitialized())
    ...

isInitialized是接口Lazy<T>上的一个公共方法,这里是docs

票数 78
EN

Stack Overflow用户

发布于 2018-05-25 23:04:18

测试lazy属性是否足够简单:

代码语言:javascript
复制
import kotlin.reflect.KProperty0
import kotlin.reflect.jvm.isAccessible

val KProperty0<*>.isLazyInitialized: Boolean
    get() {
        // Prevent IllegalAccessException from JVM access check
        isAccessible = true
        return (getDelegate() as Lazy<*>).isInitialized()
    }

…但是,您可以使引用属性而无需初始化它变得更加容易:

代码语言:javascript
复制
/**
 * Returns the value of the given lazy property if initialized, null
 * otherwise.
 */
val <T> KProperty0<T>.orNull: T?
    get() = if (isLazyInitialized) get() else null

现在,您可以执行以下操作:

代码语言:javascript
复制
private val myList by lazy {
    mutableSetOf<String>()
}

fun add(str: String) {
    // Create the list if necessary
    myList += str
}

fun remove(str: String) {
    // Don't create the list
    ::myList.orNull?.remove(str)
}

fun clear() {
    // Don't create the list
    ::myList.orNull?.clear()
}
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42522739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档