【问题标题】:Kotlin - Is it possible to initialize companion object before the init block in a class?Kotlin - 是否可以在类中的 init 块之前初始化伴随对象?
【发布时间】:2017-03-13 11:25:03
【问题描述】:

是否可以在 Kotlin 类中的 init 块之前初始化 companion object?如果是这样,怎么做?如果没有,有没有办法完成同样的事情。

我有以下场景,

class A(val iname: String) {
  init {
    foo.add(this)
  }

  companion object B {
    @JvmField val STATIC = A("hi")
    @JvmField val foo = mutableListOf<A>()   
  }

  fun printAllStatics() {
    for (a in foo) {
      print(a.iname)
    }
  }
}

调用printAllStatics 会导致空指针异常。

【问题讨论】:

  • IMO 就像你想要的那样。你的错误是什么?
  • 抱歉,我的 MWE 没有展示实际问题。我的错误

标签: oop static kotlin companion-object static-initializer


【解决方案1】:

属性初始化器和init 块的执行顺序与它们在类/对象主体中的放置顺序完全相同。这是一个例子:

companion object B {
    init {
        print("1 ")
    }

    @JvmField val foo = mutableListOf<A>().apply { print("2 ") }
    @JvmField val bar = mutableListOf<A>().apply { print("3 ") }

    init {
        print("4")
    }
}

它将打印1 2 3 4

因此,在您的情况下,交换 companion object 中的两个声明就足够了:

companion object B {
    @JvmField val foo = mutableListOf<A>()   
    @JvmField val STATIC = A("hi")
}

【讨论】:

    【解决方案2】:

    只需改变行的顺序:

    @JvmField val foo = mutableListOf<A>()
    @JvmField val STATIC = A("hi")
    

    A 中使用foo 之前,它没有被初始化。

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 1970-01-01
      • 2019-07-23
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多