如何在Kotlin中编写包级静态初始化程序?

Dan*_*Dan 8 kotlin

前一个问题显示了如何使用静态初始值设定项在类中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在类中.我想静态初始化程序添加到班-通过科特林在文件中声明的自由函数生成的类.

Ily*_*lya 8

目前没有办法将代码添加到为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)