Какие знаешь виды делегатов в Kotlin

«Какие знаешь виды делегатов в Kotlin» — вопрос из категории Kotlin, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Kotlin есть несколько видов делегатов:

  1. Делегирование свойств (by):
    val lazyValue: String by lazy { "Hello" }
    var observableValue: String by Delegates.observable("") { _, old, new -> 
        println("$old -> $new") 
    }
  1. Делегирование интерфейсов (класс может делегировать реализацию интерфейса другому объекту):
    interface Base { fun print() }
    class BaseImpl(val x: Int) : Base { override fun print() { print(x) } }
    class Derived(b: Base) : Base by b  // Делегирование
  1. Стандартные делегаты из kotlin.properties:

    • lazy (ленивая инициализация),
    • observable (отслеживание изменений),
    • vetoable (валидация перед изменением).
  2. Кастомные делегаты (реализация 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
    }
}