Kotlin 如何强制立即实例化枚举值?
如何强制立即实例化枚举值 默认情况下,在Kotlin中,枚举是在第一次访问时实例化的(如Kotlin 如何强制立即实例化枚举值?,kotlin,enums,jvm,singleton,static-initialization,Kotlin,Enums,Jvm,Singleton,Static Initialization,如何强制立即实例化枚举值 默认情况下,在Kotlin中,枚举是在第一次访问时实例化的(如objects/singleton),即下面的最小示例 class-Foo fun create(msg:String)=Foo()。还有{println(“$msg”)} 枚举类别A(val foo:foo){ 一(创建(“1”)), 二(创建(“2”)) } 枚举类B(val foo:foo){ 三(创建(“3”)), 四(创建(“4”)) } 主要内容(){ println(“主”) println(A
object
s/singleton),即下面的最小示例
class-Foo
fun create(msg:String)=Foo()。还有{println(“$msg”)}
枚举类别A(val foo:foo){
一(创建(“1”)),
二(创建(“2”))
}
枚举类B(val foo:foo){
三(创建(“3”)),
四(创建(“4”))
}
主要内容(){
println(“主”)
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)
}
}
对象温度{
初始化{
一
}
@JvmStatic fun main(args:Array){
println(“主”)
println(A.ONE)
}
}
谢谢。但是我希望避免像init
块中那样的手动重复,因为很容易忘记其中的一个枚举。我已相应地编辑了我的问题。使用库(例如反射)扫描应用程序,提取所有枚举,并在启动逻辑之前加载它们。或者只是重新思考软件设计。依赖于类初始化中应用的副作用是错误的做法。@Holger是的,我已经在实际应用中采用了不同的方法。但现在我很好奇