В чем заключается особенность делегатов свойств?
Ответ от нейросети
sobes.tech AI
Делегаты свойств в Kotlin позволяют переложить логику получения и установки значения свойства на отдельный вспомогательный класс, называемый делегатом.
Особенности:
-
Понимание
getValueиsetValue: Для свойств доступных для чтения (val) делегат должен иметь методgetValue. Для свойств, доступных для чтения и записи (var), делегат должен иметь какgetValue, так иsetValue. Эти методы принимают в качестве параметров:- Ссылка на объект, содержащий свойство (для членов класса).
- Метаданные свойства в виде объекта
KProperty.
-
Стандартные делегаты: Kotlin поставляется с рядом стандартных делегатов:
lazy: Для отложенной инициализации свойства.observable: Для выполнения некоторого действия при изменении значения свойства.vetoable: Для выполнения некоторого действия при изменении значения свойства, с возможностью отменить изменение.- Делегаты для мап: Свойство может храниться в
Map.
-
Произвольные делегаты: Можно создавать собственные классы-делегаты. Класс должен реализовывать интерфейсы
ReadOnlyProperty(дляval) илиReadWriteProperty(дляvar).
Пример использования lazy:
// Поле инициализируется только при первом доступе
val lazyValue: String by lazy {
println("Вычисляю значение")
"Hello"
}
Пример использования observable:
import kotlin.properties.Delegates
var name: String by Delegates.observable("<нет имени>") {
property, oldValue, newValue ->
println("$oldValue -> $newValue")
}
Пример пользовательского делегата:
import kotlin.reflect.KProperty
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, значение свойства '${property.name}'"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$thisRef, значение свойства '${property.name}' изменено на '$value'")
}
}
class Example {
var p: String by Delegate()
}