被其他同伴对象引用的密封类对象神秘地变为空
有一个封闭的类:
sealed class Alphabet(val name: String) { object A : Alphabet("A") object B : Alphabet("B") object C : Alphabet("C") object D : Alphabet("D") object E : Alphabet("E") companion object { val array = arrayOf(A, B, C, D, E) val list = listOf(A, B, C, D, E) } override fun toString(): String { return name } }
还有另一个伴侣对象的类:
class AlphabetMap { companion object { val map = mapOf( Alphabet.A to 1, Alphabet.B to 2, Alphabet.C to 3, Alphabet.D to 4, Alphabet.E to 5 ) } }
如果我想打印数组(或列表):
class AlphabetTest { @Test fun printValues() { Alphabet.array.forEach { print("$it ") };println() Alphabet.list.forEach { print("$it ") };println() } }
它正确地打印结果:
ABCDEABCDE
但如果我在代码中初始化AlphabetMap
:
class AlphabetTest { val m = AlphabetMap() @Test fun printValues() { Alphabet.array.forEach { print("$it ") };println() Alphabet.list.forEach { print("$it ") };println() } }
结果神秘地变成:
null BCDE null BCDE
第一个元素(A)变为null
如果我定义
val m = AlphabetMap
结果是一样的。
如果我在函数中初始化AlphabetMap:
@Test fun printValues() { val m = AlphabetMap() // or val m = AlphabetMap Alphabet.array.forEach { print("$it ") };println() Alphabet.list.forEach { print("$it ") };println() }
结果是一样的 :
null BCDE null BCDE
但如果我这样初始化:
@Test fun printValues() { Alphabet.array.forEach { print("$it ") };println() val m = AlphabetMap() // or val m = AlphabetMap Alphabet.list.forEach { print("$it ") };println() }
现在一切工作正常:
ABCDEABCDE
如果我重写AlphabetMap
class AlphabetMap { companion object { val map = mapOf( //Alphabet.A to 1, Alphabet.B to 2, Alphabet.C to 3, Alphabet.D to 4, Alphabet.E to 5 ) } }
结果变成了
A null CDEA null CDE
如果AlphebetMap是:
class AlphabetMap { companion object { val map = mapOf( Alphabet.E to 5 ) } }
结果变成:
ABCD null ABCD null
有什么可能出错? 这是一个错误? 或语言function?
环境:jdk1.8.0_144,OS X
1.2.0 1.8 false org.jetbrains.kotlin kotlin-stdlib ${kotlin.version} org.jetbrains.kotlin kotlin-stdlib-jdk8 org.jetbrains.kotlin kotlin-reflect org.jetbrains.kotlinx kotlinx-coroutines-core org.jetbrains.kotlin kotlin-test-junit test org.jetbrains.kotlin kotlin-test test
解决这个问题的唯一方法是将地图定义移到类外部:
val map = mapOf( Alphabet.A to 1, Alphabet.B to 2, Alphabet.C to 3, Alphabet.D to 4, Alphabet.E to 5 ) class AlphabetMap { companion object { } }
根据JetBrain 在youtrack和reddit 上的回复 ,这是As Designed ,没办法解决它。
初始化中的周期问题没有通用的解决方案。 无论我们提出了哪些精确的规则,如果对象A的初始化器访问对象B,而对象B的初始化器访问对象A,则其中一个将能够观察到另一个处于未初始化状态。
- Android活动重新崩溃的应用程序“碎片不再存在”Kotlin
- IllegalArgumentException:savedInstanceState指定为非空为空
- Android测试运行时不需要启动模拟器(选择设备对话框不会出现) – 空的测试套件
- 是否有一个相当于Swift init Kotlin(重复:计数:)
- 在Kotlin中IntArray与数组
- Kotlin – 如何将字符串转换为ByteArray
- Dagger 2 + Kotlin无法将Presenter插入到View中
- 什么是在Kotlin建造一个class级的正确方法
- Retrofit2返回null kotlin中的单位为204否内容响应