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

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

Ответ

В Kotlin есть несколько стандартных делегатов:

  1. lazy - инициализация при первом обращении:
val lazyValue: String by lazy {
    "Hello"
}
  1. observable - реагирует на изменения свойства:
var name: String by Delegates.observable("") { _, old, new -> 
    println("$old -> $new")
}
  1. vetoable - позволяет отменить изменение:
var age: Int by Delegates.vetoable(0) { _, old, new ->
    new > old // только если новое значение больше старого
}
  1. notNull - бросает исключение при доступе до инициализации:
var notNullStr: String by Delegates.notNull()

Также можно создавать кастомные делегаты, реализуя интерфейсы ReadOnlyProperty или ReadWriteProperty.