被其他同伴对象引用的密封类对象神秘地变为空

有一个封闭的类:

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,则其中一个将能够观察到另一个处于未初始化状态。