Что такое делегированные свойства (Delegated properties)?
Делегированные свойства (Delegated properties) — это свойства, которые не хранят своё значение напрямую, а делегируют это значение другому объекту, который реализует интерфейс Delegate. При доступе к свойству, его значение запрашивается у делегата, который может выполнить какую-то дополнительную логику, а затем вернуть требуемое значение. Пример:
Синтаксис выглядит так: val/var <имя свойства>: <Тип> by <выражение>. Выражение после by — делегат, потому что обращения get(), set() к свойству будут делегированы его методам getValue() и setValue(). Делегат не обязан реализовывать какой-то интерфейс, достаточно, чтобы у него были метод getValue() (и setValue() для var'ов) с определённой сигнатурой.
В Kotlin существуют несколько встроенных делегатов для работы с делегированными свойствами:
• lazy() — позволяет создавать лениво инициализированные свойства
• observable() — позволяет реагировать на изменения свойства
• vetoable() — позволяет отклонять изменения значения свойства на основе заданного условия
• notNull() — гарантирует, что свойство не будет иметь значение null
• map() — позволяет хранить значения свойств в словаре (Map)
Кроме того, в Kotlin можно создавать свои собственные делегаты, реализуя интерфейс ReadOnlyProperty или ReadWriteProperty. Это дает возможность создавать кастомные поведения для свойств, например, кеширование значений или логирование операций чтения/записи.
Делегированные свойства (Delegated properties) — это свойства, которые не хранят своё значение напрямую, а делегируют это значение другому объекту, который реализует интерфейс Delegate. При доступе к свойству, его значение запрашивается у делегата, который может выполнить какую-то дополнительную логику, а затем вернуть требуемое значение. Пример:
class Example {Ключевое слово by используется для обозначения свойств, методы чтения и записи которых реализованы другим объектом, который называют делегатом.
var p: String by Delegate()
}
Синтаксис выглядит так: val/var <имя свойства>: <Тип> by <выражение>. Выражение после by — делегат, потому что обращения get(), set() к свойству будут делегированы его методам getValue() и setValue(). Делегат не обязан реализовывать какой-то интерфейс, достаточно, чтобы у него были метод getValue() (и setValue() для var'ов) с определённой сигнатурой.
В Kotlin существуют несколько встроенных делегатов для работы с делегированными свойствами:
• lazy() — позволяет создавать лениво инициализированные свойства
• observable() — позволяет реагировать на изменения свойства
• vetoable() — позволяет отклонять изменения значения свойства на основе заданного условия
• notNull() — гарантирует, что свойство не будет иметь значение null
• map() — позволяет хранить значения свойств в словаре (Map)
Кроме того, в Kotlin можно создавать свои собственные делегаты, реализуя интерфейс ReadOnlyProperty или ReadWriteProperty. Это дает возможность создавать кастомные поведения для свойств, например, кеширование значений или логирование операций чтения/записи.