Класс Observable

Класс Observable позволяет создать свойство, которое вызывает обработчик при каждом изменении значения. Обработчик получает старое и новое значение свойства. Используется для реализации реактивного программирования.

Импорт

kotlinimport kotlin.properties.ObservableProperty
import kotlin.properties.Delegates

Синтаксис

kotlinvar variableName: Type by Delegates.observable(initialValue) { 
  property, oldValue, newValue -> 
  // handler code
}

Пример

Создадим наблюдаемое свойство count типа Int с начальным значением 0:

kotlinvar count: Int by Delegates.observable(0) { 
  property, oldValue, newValue -> 
  println("Property ${property.name} changed from $oldValue to $newValue")
}

count = 5
count = 10

Результат выполнения кода:

kotlinProperty count changed from 0 to 5
Property count changed from 5 to 10

Пример

Создадим наблюдаемое свойство для строки с проверкой на пустое значение:

kotlinvar 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"

Результат выполнения кода:

kotlinUsername changed from '' to 'John'
Username cannot be empty
Username changed from '' to 'Alice'

Пример

Наблюдаемое свойство для массива чисел:

kotlinvar 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)

Результат выполнения кода:

kotlinArray changed from [] to [1, 2, 3]
Array changed from [1, 2, 3] to [4, 5, 6, 7]

Пример

Использование наблюдаемого свойства в классе:

kotlinclass 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

Результат выполнения кода:

kotlinAge changed from 0 to 25
Age changed from 25 to 30

Смотрите также

  • класс Vetoable,
    который позволяет отклонять изменения свойства
  • класс Lazy,
    который предоставляет ленивую инициализацию свойства
  • интерфейс MutableList,
    который представляет изменяемый список элементов
  • класс ArrayList,
    который реализует динамический массив