Зачем вставлять val или var в конструкторы класса kotlin - PullRequest
0 голосов
/ 29 сентября 2018

Просто изучение Kotlin. В первом приведенном ниже коде есть ключевое слово val, а в другом коде его нет, что здесь отличается, если пропущены val и var?

class Person(val firstName: String, val lastName: String) {
}

class Person(firstName: String, lastName: String) {
}

Ответы [ 2 ]

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

Если вы опустите val или var в конструкторе, то единственными местами, которые могут получить доступ к этим параметрам, являются операторы инициализации, которые оцениваются во время построения.См. https://kotlinlang.org/docs/reference/classes.html

Это полезно, если вы хотите что-то сделать со значением перед его сохранением.В Java вы бы поместили этот код в тело конструктора

class Person(firstName: String, lastName: String) {
    // directly in val / var declarations
    val firstName = firstName.capitalize()
    val lastName = lastName

    // in init blocks
    val fullName: String
    init {
        fullName = "$firstName $lastName"
    }

    // secondary constructors can only see their own parameters
    // and nothing else can access those
    constructor(fullName: String) : this("", fullName)
}

Но он также работает для делегирования с использованием by

interface Named {
    fun getName(): String
}
class Human(private val fname: String, private val lname: String) : Named {
    override fun getName() = "$fname + $lname" // functions need val since
                                               // value is resolved after construction
}
class Person2(firstName: String, lastName: String) : Named by Human(firstName, lastName)

class Person3(human: Human) : Named by human {
    constructor(firstName: String, lastName: String): this(Human(firstName, lastName))
}

Или в делегировании свойства

class Person4(firstName: String, lastName: String) {
    val fullName: String by lazy { "$firstName $lastName" }
}

Примечание: замыкание фиксируется во время инициализации, поэтому значения все еще доступны, когда lazy оценивает в конечном итоге.

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

Если val или var опущены, они будут не свойствами, а параметрами, переданными в конструктор.Вы не сможете работать с ними вне конструктора.

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