Как заставить немедленное создание экземпляров значений перечисления? - PullRequest
2 голосов
/ 26 мая 2020

Как принудительно создать экземпляры значений перечисления?

По умолчанию в Kotlin перечисления создаются при первом доступе (например, object s / singleletons), то есть в следующем минимальном примере

class Foo

fun create(msg: String) = Foo().also { println("$msg") }

enum class A(val foo: Foo) {
    ONE(create("1")),
    TWO(create("2"))
}

enum class B(val foo: Foo) {
    THREE(create("3")),
    FOUR(create("4"))
}

fun main() {
    println("main")
    println(A.ONE)
}

выходы:

main
1
2
ONE

Можно ли принудительно / статически создавать экземпляры перечислений перед main, чтобы результат был следующим?

1
2
3
4
main
ONE

Конечно, я мог бы просто поместить где-нибудь что-то вроде val ignore = listOf(A.ONE, B.THREE), но я бы хотел избежать повторения вручную.

Может быть, есть способ использовать существующую аннотацию или создать новую, или что-то еще ? :)

1 Ответ

1 голос
/ 26 мая 2020

JVM загружает классы только при первом доступе. Это не только для kotlin, но и для Java. Для Java у нас есть способы инициализировать класс перед основным, например, блок инициализации stati c или Class.forName. Точно так же вы можете использовать блок инициализатора stati c в Kotlin.

object Temp {
    init {
        A.ONE
    }

    @JvmStatic fun main(args: Array<String>) {
        println("main")
        println(A.ONE)
    }
}
...