Конструкторы в Котлине
Я изучаю Kotlin
из официальных документов, я создал один class
, как показано ниже, где я создал один constructor
, который имеет два parameters
. Тело constructor
находится в блоке init
.
class Person(name: String, surname: String) {
init {
Log.d("App", "Hello");
}
}
Ну, я хочу создать еще один constructor
, который займет один parameter
в constructor
. Что можно сделать в Kotlin
Ответы
Ответ 1
Ну init
не является телом конструктора. Он вызывается после основного конструктора с контекстом основного конструктора.
Как указано в Официальной документации:
Основной конструктор не может содержать никакого кода. Код инициализации может быть помещен в блоки инициализатора с префиксом ключевого слова init:
class Customer(name: String) {
init {
logger.info("Customer initialized with value ${name}")
}
}
Обратите внимание, что параметры первичного конструктора могут использоваться в блоках инициализатора. Они также могут использоваться в инициализаторах свойств, объявленных в корпусе класса:
class Customer(name: String) {
val customerKey = name.toUpperCase()
}
Фактически, для объявления свойств и инициализации их из основного конструктора, Kotlin имеет сжатый синтаксис:
class Person(val firstName: String, val lastName: String, var age: Int) {
// ...
}
В соответствии с вашим вопросом вы можете добавить конструктор для принятия одного параметра, например:
class Person(name: String, surname: String) {
constructor(name: String) : this(name, "") {
// constructor body
}
init {
Log.d("App", "Hello");
}
}
Но это не выглядит правильным, поскольку нам не нужно передавать второй аргумент пустой строке. Поэтому мы можем заказать конструктор следующим образом:
class Person(name: String) {
constructor(name: String, surname: String) : this(name) {
// constructor body
}
init {
Log.d("App", "Hello");
}
}
Надеюсь, что это поможет.
Ответ 2
Внутри класса используйте ключевое слово constructor
для создания вторичного конструктора. Например:
class Person(name: String, surname: String) {
init {
Log.d("App", "Hello");
}
constructor(id: Int) {
}
}
Подробнее... Вторичные конструкторы
EDIT:
Правило: Если класс имеет первичный конструктор, каждый вторичный конструктор должен делегировать основному конструктору, прямо или косвенно, через другой вторичный конструктор (ы). Делегирование с другим конструктором того же класса выполняется с использованием этого ключевого слова.
class Person(val name: String) {
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
Поэтому, когда вы вызываете вторичный конструктор, он вызывает первичный конструктор для инициализации имени, после чего вы делаете свой материал во вторичном конструкторе. В приведенном выше примере имя инициализируется вызовом первичного конструктора.
Ответ 3
Первый способ с пустыми значениями
// (name: String, surname: String) default constructor signature
class Person(name: String, surname: String) {
// init block , represents the body of default constructor
init {
Log.d("primary", "Hello");
}
// secondary constructor
// this(name,"") call to default constructor
constructor(name : String):this(name,""){
Log.d("secondary", "Hello");
}
}
почему this(name,"")
Если класс имеет первичный конструктор, каждый вторичный конструктор необходимо делегировать основному конструктору либо напрямую, либо косвенно через другой вторичный конструктор (ы). Делегация другой конструктор того же класса выполняется с использованием этого ключевого слова:
или
kotlin не позволит использовать null
как this(name,null)
, поэтому используйте ?
для представления значений null
с типом, surname: String?
class Person(name: String, surname: String?) {
init {
Log.d("primary", "Hello");
}
constructor(name : String):this(name,null){
Log.d("secondary", "Hello");
}
}
Ответ 4
Вторичные конструкторы
Класс также может объявлять вторичные конструкторы, которые имеют префикс конструктора:
class Person {
constructor(parent: Person) {
parent.children.add(this)
} }
Если класс имеет первичный конструктор, каждый вторичный конструктор должен делегировать основному конструктору прямо или косвенно через другой вторичный конструктор (ы). Делегирование на другой конструктор того же класса выполняется с помощью этого ключевого слова:
class Person(val name: String) {
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
} }
см. https://kotlinlang.org/docs/reference/classes.html Часть второстепенных конструкторов
Ответ 5
Вот как вы создаете другой конструктор.
class Person(name: String, surname: String) {
init {
Log.d("App", "Hello");
}
constructor(id: Int) : this("example name", "example surname") {
}
}
Всегда помните, что вторичный конструктор должен будет ссылаться на первичный конструктор и его параметры, используя это ключевое слово.