Инициализировать свойство val в классе данных Kotlin с помощью вторичного конструктора - PullRequest
0 голосов
/ 01 сентября 2018
class Animal {
    val name: String

    constructor(name: String){
        this.name = name // initialized via constructor
    }
}

Для указанного выше класса в Kotlin я могу инициализировать свойство val через вторичный конструктор , но то же самое не разрешено для Классы данных

data class User(val name: String, val postalCode: Int) {
    val email: String

    constructor( email: String): this("", 1){
        this.email = email // error: value can not be reassigned
    }

}

Что я не могу понять, так это то, где свойство электронной почты уже инициализировано, поскольку я не объявил никаких инициализаций?

1 Ответ

0 голосов
/ 01 сентября 2018

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

val email = "foo@bar.com"

Или в блоке инициализатора:

val email: String

init {
    email = "foo@bar.com"
}

Компилятор заставляет вас перенаправлять все вызовы вторичного конструктора первичному конструктору, и поскольку первичный конструктор уже должен инициализировать все свойства внутри класса (в противном случае вызов его создаст частично инициализированный экземпляр, как в вашем примере кода) ), также не имеет смысла инициализировать их в теле вторичного конструктора, особенно для val, который нельзя переназначить.

...