Свойство Котлин не инициализировано, но почему?
Мы пишем внутренний 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
}
Использование DSL из Java:
public class ExpectMyObject {
@Test
public void testMyObjectLoaded() {
Assert.assertEquals(1, Dsl.Companion.getStored().size)
}
}
Я ожидал, что свойство пакета будет инициализировано при запуске JVM. Но тест не пройден. Что я пропускаю?
1 ответ
Решение
Вы должны ссылаться на что-то определенное в том же файле, что и val myObject
прямо или косвенно из вашего теста. В противном случае его сгенерированный класс не будет загружен. Например
@Test
public void testMyObjectLoaded() {
your.package.FileNameKt.getMyObject();
Assert.assertEquals(1, Dsl.Companion.getStored().size);
}