Класс Observable
Класс Observable позволяет создать свойство,
которое вызывает обработчик при каждом изменении значения.
Обработчик получает старое и новое значение свойства.
Используется для реализации реактивного программирования.
Импорт
import kotlin.properties.ObservableProperty
import kotlin.properties.Delegates
Синтаксис
var variableName: Type by Delegates.observable(initialValue) {
property, oldValue, newValue ->
// handler code
}
Пример
Создадим наблюдаемое свойство count типа Int
с начальным значением 0:
var count: Int by Delegates.observable(0) {
property, oldValue, newValue ->
println("Property ${property.name} changed from $oldValue to $newValue")
}
count = 5
count = 10
Результат выполнения кода:
Property count changed from 0 to 5
Property count changed from 5 to 10
Пример
Создадим наблюдаемое свойство для строки с проверкой на пустое значение:
var userName: String by Delegates.observable("") {
_, oldValue, newValue ->
if (newValue.isNotEmpty()) {
println("Username changed from '$oldValue' to '$newValue'")
} else {
println("Username cannot be empty")
}
}
userName = "John"
userName = ""
userName = "Alice"
Результат выполнения кода:
Username changed from '' to 'John'
Username cannot be empty
Username changed from '' to 'Alice'
Пример
Наблюдаемое свойство для массива чисел:
var numbers: IntArray by Delegates.observable(intArrayOf()) {
_, oldValue, newValue ->
println("Array changed from ${oldValue.contentToString()} to ${newValue.contentToString()}")
}
numbers = intArrayOf(1, 2, 3)
numbers = intArrayOf(4, 5, 6, 7)
Результат выполнения кода:
Array changed from [] to [1, 2, 3]
Array changed from [1, 2, 3] to [4, 5, 6, 7]
Пример
Использование наблюдаемого свойства в классе:
class User {
var age: Int by Delegates.observable(0) {
_, oldValue, newValue ->
println("Age changed from $oldValue to $newValue")
}
}
val user = User()
user.age = 25
user.age = 30
Результат выполнения кода:
Age changed from 0 to 25
Age changed from 25 to 30
Смотрите также
-
класс
Vetoable,
который позволяет отклонять изменения свойства -
класс
Lazy,
который предоставляет ленивую инициализацию свойства -
интерфейс
MutableList,
который представляет изменяемый список элементов -
класс
ArrayList,
который реализует динамический массив