如何强制立即实例化枚举值?
默认情况下,在 Kotlin 中,枚举在首次访问时实例化(如object
s/singleton(,即以下最小示例
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)
的东西放在某个地方,但我想避免这种手动重复。
也许有一种方法可以使用一些现有的注释,或者创建一个新的注释,或者其他东西?:)
JVM 仅在首次访问时加载类。这不仅适用于 kotlin,也适用于 Java。对于 Java,我们有办法在 main 之前初始化一个类,例如,静态初始值设定项块或Class.forName
。类似地,您可以在 Kotlin 中使用静态初始值设定项块。
object Temp {
init {
A.ONE
}
@JvmStatic fun main(args: Array<String>) {
println("main")
println(A.ONE)
}
}