Вариант использования для более чем одного блока инициализации в Kotlin? - PullRequest
3 голосов
/ 13 февраля 2020

Я заметил, что классы в Kotlin могут иметь более одного блока инициализации. Если это так, они выполняются в последовательности.

Каков хороший вариант использования для более чем одного?

Ответы [ 2 ]

3 голосов
/ 13 февраля 2020

Рассмотрим следующий фрагмент.

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
  } 
}

Поскольку основной конструктор не может иметь никакого кода, описанная выше ситуация была бы невозможна без нескольких блоков инициализации. Другими словами, возможность иметь несколько блоков инициализации помогает решать зависимости, связанные со свойствами во время инициализации; более того, когда свойства доступны только для чтения.

1 голос
/ 13 февраля 2020

один вариант использования будет modularize class initialization.

Если класс имеет несколько зависимостей и инициализация каждой зависимости нетривиальна, то имеет смысл иметь отдельный блок init для каждой инициализации зависимости, чтобы ваш код оставался управляемым. вы можете иметь один блок инициализации, но за кодом будет трудно следить и управлять им. Я думаю, Принцип единой ответственности применим здесь.

Например, допустим, у нас есть класс с несколькими зависимостями, если вы используете несколько блоков инициализации, ваш код будет

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

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

// Initilization code for dependency n
init{
// complex calculations for nth dependency initialization 
}

Здесь ваша инициализация выглядит ясной, и вы можете видеть, что делает блок инициализации.

Если, однако, вы используете один блок инициализации, ваш код будет

// Initilization code for all dependencies
init{
   // complex calculations for 1st dependency initialization 
   // complex calculations for 2nd dependency initialization 
   // complex calculations for nth dependency initialization 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...