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

Я изучаю 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") {

}
}

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