前一个问题显示了如何使用静态初始值设定项在类中companion object
.我正在尝试找到一种在包级别添加静态初始化程序的方法,但似乎包没有伴随对象.
// compiler error: Modifier 'companion' is not applicable inside 'file'
companion object { init { println("Loaded!") } }
fun main(args: Array<String>) { println("run!") }
Run Code Online (Sandbox Code Playgroud)
我试过,可能已经是有道理的(其他的变化init
就其本身而言static
),我知道作为一个解决办法,我可以用暴殄天物val
作为
val static_init = {
println("ugly workaround")
}()
Run Code Online (Sandbox Code Playgroud)
但有没有一种干净,官方的方式来达到同样的效果?
编辑:正如@ mfulton26的回答所提到的那样,JVM中没有真正的包级函数.在幕后,kotlin编译器包含任何自由函数,包括main
在类中.我想静态初始化程序添加到该班-通过科特林在文件中声明的自由函数生成的类.
目前没有办法将代码添加到为Kotlin文件类生成的静态构造函数中,只有顶级属性初始化程序才能到达.这听起来像一个功能请求,所以现在有一个问题需要跟踪:KT-13486包级"init"块
另一种解决方法是将初始化放在顶级私有/内部对象中,并在那些依赖于初始化效果的函数中引用该对象.当第一次引用对象时,对象会被懒惰地初始化.
fun dependsOnState(arg: Int) = State.run {
arg + value
}
private object State {
val value: Int
init {
value = 42
println("State was initialized")
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1953 次 |
最近记录: |