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);
}
我们正在用 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);
}