Что такое делегированные свойства (Delegated properties)?



Делегированные свойства (Delegated properties) — это свойства, которые не хранят своё значение напрямую, а делегируют это значение другому объекту, который реализует интерфейс Delegate. При доступе к свойству, его значение запрашивается у делегата, который может выполнить какую-то дополнительную логику, а затем вернуть требуемое значение. Пример:



class Example {

var p: String by Delegate()

}



Ключевое слово by используется для обозначения свойств, методы чтения и записи которых реализованы другим объектом, который называют делегатом.



Синтаксис выглядит так: val/var <имя свойства>: <Тип> by <выражение>. Выражение после by — делегат, потому что обращения get(), set() к свойству будут делегированы его методам getValue() и setValue(). Делегат не обязан реализовывать какой-то интерфейс, достаточно, чтобы у него были метод getValue() (и setValue() для var'ов) с определённой сигнатурой.



В Kotlin существуют несколько встроенных делегатов для работы с делегированными свойствами:



• lazy() — позволяет создавать лениво инициализированные свойства



• observable() — позволяет реагировать на изменения свойства



• vetoable() — позволяет отклонять изменения значения свойства на основе заданного условия



• notNull() — гарантирует, что свойство не будет иметь значение null



• map() — позволяет хранить значения свойств в словаре (Map)



Кроме того, в Kotlin можно создавать свои собственные делегаты, реализуя интерфейс ReadOnlyProperty или ReadWriteProperty. Это дает возможность создавать кастомные поведения для свойств, например, кеширование значений или логирование операций чтения/записи.