1

鉴于以下代码:

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

}

如果我创建了两个实例Foo

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

将被names初始化/分配两次,因此有任何后续Foo初始化?

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

更新:

这是假设我不想拥有:var names: arrayOf("George", "Keith", "Martha", "Margret")内部伴随对象。

4

4 回答 4

3

名称是否会被初始化/分配两次,因此会进行任何后续的 Foo 初始化?

与 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
于 2019-12-31T09:19:56.760 回答
1

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

class Foo {

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

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

通过这种方式,您不会每次都为您的数组进行初始化,希望这是有道理的!

于 2019-12-31T09:20:37.633 回答
0
class Foo {
Var names :ArrayList<String> = arrayOf("George", "Keith", "Martha", "Margret")
companion object {
    lateinit var names: Array<String>
}}

你可以这样做

于 2019-12-31T10:03:16.807 回答
0

Kotlin 中的伴侣对象与 java 中的静态对象相同。通过在我们的类中声明一个伴生对象,您将能够使用与在 Java 中调用静态方法相同的语法来调用其成员。是的,它也将在 kotlin 中初始化一次,我们还有一个关键字用于创建单例实例kotlin 中的单身人士。

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

于 2019-12-31T09:16:15.583 回答