gpt4 book ai didi

kotlin - Kotlin `object`初始化顺序导致意外的空实例

转载 作者:行者123 更新时间:2023-12-02 13:16:27 25 4
gpt4 key购买 nike

考虑以下代码:

sealed class DataType<T : Any> {
abstract fun inputToType(input: String): T
abstract fun typeToSql(value: T): String

companion object {
val all = listOf(StringDt, LongDt)
}
}

object StringDt : DataType<String>() {
override fun inputToType(input: String) = input
override fun typeToSql(value: String) = "\"${value}\""
}

object LongDt : DataType<Long>() {
override fun inputToType(input: String) = input.toLong()
override fun typeToSql(value: Long) = value.toString()
}

val dataTypeList = listOfNotNull(StringDt, LongDt)

println(dataTypeList)
println(DataType.all)
注意事项:

按照 documentation
  • object(以及我的理解)是单例并且始终实例化
  • 这两个对象(StringDtLongDt)非常相似
  • println(DataType.all)的结果表明未初始化对象之一。那怎么可能?我希望所有列表元素都将被初始化。
    IntelliJ版本:CE 2020.2
    Kotlin插件版本:1.4.0-release-IJ2020.2-1
    这是 running example,它显示静态列表中包含一个null元素,而非静态列表中包含两个已初始化的对象。

    最佳答案

    它的发生是由于循环静态初始化。用两个词很难解释这个问题,但是您可以通过here来了解它。
    要解决此问题,您可以像这样更改all初始化:

    val all by lazy { listOf(StringDt, LongDt) }

    关于kotlin - Kotlin `object`初始化顺序导致意外的空实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63487328/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com