В чем разница между блоком инициализации и конструктором в kotln? - PullRequest
1 голос
/ 26 марта 2019

Я начал изучать Kotlin. Хотелось бы узнать разницу между блоком init и constructor. В чем разница между этим и как мы можем использовать это для улучшения?

class Person constructor(var name: String, var age: Int){
var profession: String = "test"

init{
    println("Test")
    }

}

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Блок init выполняется сразу после основного конструктора. Блоки инициализатора эффективно становятся частью основного конструктора. Конструктор является вторичным конструктором. Делегирование первичному конструктору происходит как первый оператор вторичного конструктора, поэтому код во всех блоках инициализатора выполняется перед телом вторичного конструктора.

Пример

class Sample(private var s : String) {
constructor(t: String, u: String) : this(t) {
    this.s += "$u"
}
init {
    s += "B"
}
}

Думаю, вы инициализировали класс Sample с

Sample("T","U")

Вы получите строковый ответ в переменной s как "TBU". Значение "T" присваивается s из основного конструктора класса Sample , а затем сразу же начинает выполняться блок init, добавляя "B" к переменной. После того, как блок init начинает выполнять блок вторичного конструктора и s станет "TBU".

1 голос
/ 26 марта 2019

Класс в классе Kotlin - первичный конструктор (тот, который следует за именем класса), который не содержит код, он может только инициализировать свойства (например, class X(var prop: String)).

Блок init{..} в том месте, , куда вы можете поместить больше кода, который будет запускаться после инициализации свойств :

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

Подробнее об этом в https://kotlinlang.org/docs/reference/classes.html#constructors

Вот пример:



class X(var b: String) {
  val a = print("a")

  init {
    print("b")
  }

  constructor() : this("aaa") {
    print("c")
  }
}


X()

При вызове он печатает abc. Таким образом, init{..} in вызывается после первичного конструктора, но перед вторичным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...