Ответ
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" }
Ключевые отличия:
- Делегат можно переиспользовать для разных свойств
- Делегаты поддерживают сложную логику (например,
lazy,observable) - Переопределение проще для простых случаев