Зачем вставлять val или var в конструкторы класса kotlin
Просто изучение Kotlin В первом коде внизу есть val
Ключевое слово прямо в другом коде нет, что здесь отличается, если val
а также var
опущен?
class Person(val firstName: String, val lastName: String) {
}
class Person(firstName: String, lastName: String) {
}
2 ответа
Если вы опустите 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
оценивает в конце концов.
Если val или var опущены, они будут не свойствами, а параметрами, передаваемыми в конструктор. Вы не сможете работать с ними вне конструктора.