Extension-функция не получает доступ к private-полям класса, поэтому fullName не компилируется. Перенесите её внутрь Person или откройте нужные свойства осознанно.
Выявление ошибок в Kotlin‑классе с data class
Extension-функция не получает доступ к private-полям класса, поэтому fullName не компилируется. Перенесите её внутрь Person или откройте нужные свойства осознанно.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Найдите и объясните недостатки представленного фрагмента кода на Kotlin. В примере используется data class с приватными полями и расширяющая функция, которая пытается получить к ним доступ.
data class Person(private val givenName: String, private val familyName: String)
fun Person.fullName() = "${this.givenName} ${this.familyName}"
fun main() {
println(Person("John", "Doe").fullName())
}
Ответ
Extension-функция не получает доступ к private-полям класса, поэтому fullName не компилируется. Перенесите её внутрь Person или откройте нужные свойства осознанно.
Вариант с сохранением приватности:
data class Person(private val givenName: String, private val familyName: String) {
fun fullName() = "$givenName $familyName"
}
Тогда main напечатает John Doe. Расширения не являются настоящими членами класса и не обходят его инкапсуляцию. Сам data class с private-параметрами допустим, но сгенерированные методы также нужно учитывать, если цель — скрыть чувствительные данные.
Источник: kotlinlang.org.