В чем разница между Delegated property и переопределением get и set

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

Ответ

Delegated property (by) позволяет вынести логику get/set в отдельный класс (ReadOnlyProperty/ReadWriteProperty), что улучшает переиспользование кода. Переопределение get/set инкапсулирует логику внутри самого свойства.

Пример делегата:

class Example {
    var p: String by Delegate() // логика в отдельном классе
}

class Delegate {
    operator fun getValue(...) = "value"
    operator fun setValue(..., value: String) { /*...*/ }
}

Переопределение get/set:

var p: String = ""
    get() = field.uppercase()
    set(value) { field = "Prefix: $value" }

Ключевые отличия:

  1. Делегат можно переиспользовать для разных свойств
  2. Делегаты поддерживают сложную логику (например, lazy, observable)
  3. Переопределение проще для простых случаев