【问题标题】:Kotlin: are companion object lateinit vars initialised once?Kotlin:伴随对象lateinit vars是否初始化一次?
【发布时间】:2019-12-31 09:08:35
【问题描述】:

给定以下代码:

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")

【问题讨论】:

  • @JeelVankhede Ive 刚刚更新了我的问题。我知道有人会跳到那里去。
  • 我假设你们都同意每次调用 init 时,都会为 names 分配一个新的数组实例?
  • 是的,您可以尝试的另一件事是将初始化到另一个对象作为局部变量,然后使用它来分配您的伴随变量。

标签: android kotlin static companion-object kotlin-lateinit


【解决方案1】:

名称将被初始化/分配两次,因此与 任何后续的 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

【讨论】:

  • companion object 中移动getHashCode 可能会更清楚一点。
【解决方案2】:

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

class Foo {

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

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

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

【讨论】:

  • object ArrayOfString 是 Kotlin 中的单例,不是吗?所以这与在companion object 中初始化names 几乎相同。我认为这样做可以保持简单,因为我可能过度设计了一些东西。
  • 是的,它是单例!
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:
    class Foo {
    Var names :ArrayList<String> = arrayOf("George", "Keith", "Martha", "Margret")
    companion object {
        lateinit var names: Array<String>
    }}
    

    你可以这样做

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 2017-03-13
      • 1970-01-01
      • 2022-12-15
      • 2019-07-23
      • 2020-08-08
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多