首页 文章

Kotlin - 是否可以在类中的init块之前初始化伴随对象?

提问于
浏览
8

是否可以在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 会导致空指针异常 .

2 回答

  • 8

    只需更改行的顺序:

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

    A 中使用 foo 之前,它尚未初始化 .

  • 3

    属性初始值设定项和 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")
    }
    

相关问题