Kotlin:伴随对象 lateinit vars 初始化一次吗?

Kotlin: are companion object lateinit vars initialised once?

给定以下代码:

class Foo {
    companion object {
        lateinit var names: Array<String>
    }
    init {
        names = arrayOf("George", "Keith", "Martha", "Margret")
    }

}

如果我创建了 Foo 的两个实例:

var foo1 = Foo();
var foo2 = Foo();

names 将是 initialised/assigned 两次,因此任何后续 Foo 初始化?

我的意图是让一个简单的静态变量 names 保存那些预定义的名称。

更新:

这是假设我不希望有:var names: arrayOf("George", "Keith", "Martha", "Margret") inside companion object。

Kotlin 中的伴随对象与 java 中的静态方法相同。通过在我们的 class 中声明一个伴随对象,您将能够使用与在 Java.And 中调用静态方法相同的语法来调用它的成员是的,它也会在 kotlin 中被初始化一次,我们有一个 more 单例实例的关键字,用于在 kotlin 中创建单例。

另一方面,init 将在主构造函数之后调用,您也可以让一个或多个 init 块依次执行。

is names going to be initialised/assigned twice, and therefore with any subsequent Foo initialisation?

正如在 init 中一样,它每次都会初始化 names,因此它会为每个实例创建新的 Array

你可以通过简单的打印来验证这一点

class Foo {
    companion object {
        lateinit var names: Array<String>
    }
    init {
        println("Creating Foo")
        names = arrayOf("George", "Keith", "Martha", "Margret")
    }

    fun getHashCode():Int{
        return names.hashCode()
    }

}

fun main() {

    var foo1 = Foo();
    println(foo1.getHashCode());
    var foo2 = Foo();
    println(foo2.getHashCode());
}

输出哈希码不同:

Creating Foo
746292446
Creating Foo
1072591677

您可以尝试下面的代码块来实现您想要的。

class Foo {

    object ArrayOfString {
        val names = arrayOf("George", "Keith", "Martha", "Margret")
    }

    companion object {
        val names: Array<String> = ArrayOfString.names
    }
}

这样,你的数组就不会每次都初始化,希望有意义!

class Foo {
Var names :ArrayList<String> = arrayOf("George", "Keith", "Martha", "Margret")
companion object {
    lateinit var names: Array<String>
}}

你可以这样做