Delegates - Kotlin
September 18, 2018 · View on GitHub
В Kotlin существует возможность делегировать создание класса другому классу. Но кроме этого можно делегировать инициализацию свойств в классе некоторому объекту-делегату.
Для этого существует ряд стандартных делегатов:
lazy {}observable() {}
Lazy предоставляет ленивую инициализацию свойств, т.е. они будут проинициализированы единожды при первом вызове, тем значением , которое возвращает лямбда.
private val locationManager: LocationManager by lazy {
(appContext.getSystemService(Context.LOCATION_SERVICE) as LocationManager)
}
Observable - более интересный делегат. Он принимает начальное значение и лямбду , у которой три параметра - присваиваемое свойство(KProperty), старое и новое значения.
Удобно использовать в случае, когда надо например сравнить старое и новое значение и в зависимости от этого сделать те или иные действия, или же, когда надо сделать “наблюдаемое” свойство(т.е. надо реагировать на его изменения)
private var selectedPinChangeDelegateData: PinSelectedData by Delegates.observable(
PinSelectedData()
) { _, oldValue, newValue ->
if (newValue != oldValue) {
pinSelectedSubject.onNext(newValue)
renderMarkerSelection(oldValue, newValue)
}
}
Также можно писать свои делегаты. Для этого надо наследоваться от ReadWriteProperty / ReadOnlyProperty и переопределить их методы.
Задачка по делегатам на KotlinKoans