Ответ
В Kotlin есть несколько видов делегатов:
- Делегирование свойств (
by):
val lazyValue: String by lazy { "Hello" }
var observableValue: String by Delegates.observable("") { _, old, new ->
println("$old -> $new")
}
- Делегирование интерфейсов (класс может делегировать реализацию интерфейса другому объекту):
interface Base { fun print() }
class BaseImpl(val x: Int) : Base { override fun print() { print(x) } }
class Derived(b: Base) : Base by b // Делегирование
-
Стандартные делегаты из
kotlin.properties:lazy(ленивая инициализация),observable(отслеживание изменений),vetoable(валидация перед изменением).
- Кастомные делегаты (реализация
ReadOnlyProperty/ReadWriteProperty).
Пример кастомного делегата:
class LoggingDelegate<T> : ReadWriteProperty<Any?, T> {
private var value: T? = null
override fun getValue(thisRef: Any?, property: KProperty<*>) = value!!
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
println("Property ${property.name} changed to $value")
this.value = value
}
}