Свойство Котлин не инициализировано, но почему?

Мы пишем внутренний 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);
}
Другие вопросы по тегам