Kotlin 属性 未初始化,但为什么呢?

Kotlin property not initialized, but why?

我们正在用 Kotlin 编写内部 DSL。然后我们从 Java 代码中使用它。我们看到 DSL 中定义的对象尚不可用。因此问题是:为什么包 属性 没有初始化?

简化的情况是:

val myObject = dsl {
    ...
}

以及 DSL:

class Dsl() {
    companion object {
        val stored = mutableListOf<Dsl>()

        fun add(added: Dsl) {
            stored += added
        }
    }
}

fun dsl(init: Dsl.() -> Unit) {
    val dsl = Dsl()
    dsl.init()
    Dsl.add(dsl) // Intentional side effect to simplify DSL definition
}

使用来自 Java 的 DSL:

public class ExpectMyObject {
    @Test
    public void testMyObjectLoaded() {
        Assert.assertEquals(1, Dsl.Companion.getStored().size)
    }
}

我希望包 属性 在启动 JVM 时被初始化。但是测试失败了。我忽略了什么?

您需要直接或间接从您的测试中引用与 val myObject 在同一文件中定义的 某些内容。否则它生成的 class 将不会被加载。例如

@Test
public void testMyObjectLoaded() {
    your.package.FileNameKt.getMyObject();
    Assert.assertEquals(1, Dsl.Companion.getStored().size);
}