Kotlin 中多个 init 块的用例?

fiz*_*ear 9 kotlin

我注意到 Kotlin 中的类可以有多个 init 块。如果是,它们将按顺序执行。

拥有多个的好用例是什么?

Ven*_*ath 8

考虑以下片段。

class Foo() {
  val x = Bar.getValue()

  init {
    // check the validity of x and abort if invalid
  }

  val y = Cow.getValue(x)  // requires x to be valid

  init {
    // continue with initialization
  } 
}
Run Code Online (Sandbox Code Playgroud)

由于主构造函数不能有任何代码,没有多个 init 块就不可能出现上述情况。换句话说,拥有多个 init 块的能力有助于解决初始化期间涉及属性的依赖关系;当属性为只读时更是如此。


mig*_*WOZ 6

一种用例是modularize class initialization.

如果一个类具有多个依赖项,并且每个依赖项的初始化都非常重要,那么init为每个依赖项初始化使用单独的块是有意义的,以便您的代码保持可管理性。您可以有一个初始化块,但代码将很难遵循和管理。

我认为单一责任原则适用于此。

例如,假设我们有一个具有多个依赖项的类,如果您使用多个 init 块,您的代码将是

// Initialization code for dependency 1
init{
 // complex calculations for dependency 1 initialization
 }

// Initialization code for dependency 2
init{ 
   // complex calculations for dependency 2 initialization
 }

// Initialization code for dependency n
init{
// complex calculations for nth dependency initialization 
}
Run Code Online (Sandbox Code Playgroud)

这里你的初始化看起来很清楚,你可以看到哪个 init 块做了什么。

但是,如果您使用单个 init 块,您的代码将是

// Initialization code for all dependencies
init{
   // complex calculations for 1st dependency initialization 
   // complex calculations for 2nd dependency initialization 
   // complex calculations for nth dependency initialization 
}
Run Code Online (Sandbox Code Playgroud)