Kotlin中的静态初始化块

100

静态初始化块在 Kotlin 中的等价物是什么?

我知道 Kotlin 的设计是不使用静态东西,但我正在寻找具有等效语义的内容——当类第一次加载时会运行代码。

我的具体用例是我想启用 Android AppCompat 库中的 DayNight 特性,说明中说要将一些代码放在 Application 类的静态初始化块中。


看看这个 init-blocks kotlin vs Java,我解释了什么是 init block,它的调用顺序以及它与 Java 的 init block、静态 init block 等的区别。 - Chetan Gupta
2个回答

141

从某种角度来看,Kotlin中的伴生对象(companion objects)等同于Java类的静态部分。特别地,它们在类首次使用之前被初始化,这使您可以使用它们的init块来替换Java的静态初始化器:

class C {
    companion object {
        init {
            //here goes static initializer code
        }
    }
}

@voddan,这不是过度设计,实际上这就是Kotlin网站上建议的做法:“当相应的类被加载(解决)时,伴生对象将被初始化,与Java静态初始化器的语义匹配。”对象表达式和声明之间的语义差异


1
伴生对象在这里有些过度了。 - voddan
5
@voddan,OP问及如何在使用现有类之前执行代码。使用object声明的解决方案需要实际在某个地方使用它,因为它采用了延迟初始化。 - hotkey
2
@voddan,您能否解释一下为什么这是过度设计,有哪些替代方案吗? - Marcin Koziński
2
抱歉,我的错,我误以为你不关心类加载。伴生对象在这里是正确的解决方案。 - voddan
如果你只想实现静态初始化,那么伴生对象应该被设为私有或受保护。 - mipa

3
companion object  { 
    // Example for a static variable
    internal var REQUEST_CODE: Int? = 500

    // Example for a static method
    fun callToCheck(value: String): String {
        // your code
    }
}

类中的对象声明可以使用关键字 companion 进行标记。在此之下,我们可以像 Java 中一样使用静态方法和变量。例如:classname.methodname 或 classname.variablename。


1
给你的代码添加一些解释。 - Derrick
@DerickDaniel请现在检查。 - abhilasha Yadav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接