Intereting Posts
Не удалось построить Gradle с помощью Kotlin, Scala и Java Почему публичные встроенные функции вызывают частные конструкторы Найти использование основного конструктора класса Котлин Как определить arralist глобально в kotlin Сгладить массив в Котлине Как связать общие типы двух параметров функции Kotlin? Использование данных Amazon AWS Cognito `. Well-known / jwks.json` не позволяет base64 декодировать некоторые поля ClassNotFoundException с ароматами продукта и Kotlin Получение ошибки «Несовместимые типы» при использовании кода, сгенерированного из класса данных Kotlin Android Dagger: я не могу предоставить внешний класс без конструктора @Inject Ошибка Observable.combineLatest после обновления до RxJava 2.xx – не может выводиться тип Kotlin VerifyError: неинициализированный объект существует на обратной ветви 90 Сгладить итератор двумерного массива в Котлине Не удается профилировать приложение Android в Android Studio Использование Kotlin Coroutines в Android

Конструкторы в Котлине

Я изучаю Kotlin из официальных документов, я создал один class как показано ниже, где я создал один constructor который имеет два parameters . Тело constructor находится в блоке init .

 class Person(name: String, surname: String) { init { Log.d("App", "Hello"); } } 

Ну, я хочу создать еще один constructor который примет один parameter в constructor . Чем заняться в Kotlin

Well init – это не тело конструктора. Он вызывается после основного конструктора с контекстом первичного конструктора.

Как указано в Официальной документации:

Основной конструктор не может содержать никакого кода. Код инициализации может быть помещен в блоки инициализации, которые имеют префикс ключевого слова init:

 class Customer(name: String) { init { logger.info("Customer initialized with value ${name}") } } 

Обратите внимание, что параметры первичного конструктора могут использоваться в блоках инициализатора. Они также могут использоваться в инициализаторах свойств, объявленных в классе класса:

 class Customer(name: String) { val customerKey = name.toUpperCase() } 

Фактически, для объявления свойств и их инициализации из основного конструктора, Котлин имеет краткий синтаксис:

 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"); } } 

Надеюсь, поможет.

Внутри класса используйте ключевое слово constructor для создания вторичного конструктора. Подобно :

 class Person(name: String, surname: String) { init { Log.d("App", "Hello"); } constructor(id: Int) { } } 

Для дополнительной информации см. Вторичные конструкторы

РЕДАКТИРОВАТЬ:
Правило. Если класс имеет первичный конструктор, каждый вторичный конструктор должен делегировать основному конструктору, прямо или косвенно, через другой вторичный конструктор (ы). Делегирование другого конструктора того же класса выполняется с использованием этого ключевого слова.

 class Person(val name: String) { constructor(name: String, parent: Person) : this(name) { parent.children.add(this) } } 

Поэтому, когда вы вызываете вторичный конструктор, он вызывает первичный конструктор для инициализации имени, после чего вы делаете свой материал во вторичном конструкторе. В приведенном выше примере имя инициализируется вызовом основного конструктора.

Первый путь с пустыми значениями

 // (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"); } } 

Вторичные конструкторы

Класс также может объявлять вторичные конструкторы, которые имеют префикс конструктора:

 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 Часть вторичных конструкторов

Вот как вы создаете другой конструктор.

 class Person(name: String, surname: String) { init { Log.d("App", "Hello"); } constructor(id: Int) : this("example name", "example surname") { } } 

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