НОВИНКА!
Занимательная математика от Трепачёва. Присоединяйтесь к нам!
211 of 1310 menu

Функция vetoable

Функция vetoable создает делегат свойства, который позволяет перехватывать попытки изменения значения и отклонять их при необходимости. В первый параметр передается начальное значение свойства, а во второй параметр - лямбда-функция, которая принимает старое значение, новое значение и возвращает Boolean. Если функция возвращает true, изменение применяется, если false - изменение отклоняется.

Импорт

import kotlin.properties.Delegates.vetoable

Синтаксис

fun <T> vetoable( initialValue: T, onChange: (property: KProperty<*>, oldValue: T, newValue: T) -> Boolean ): ReadWriteProperty<Any?, T>
fun <T> vetoable( initialValue: T, onChange: (oldValue: T, newValue: T) -> Boolean ): ReadWriteProperty<Any?, T>

Пример

Создадим свойство, которое принимает только положительные числа:

var positiveNumber: Int by vetoable(0) { old, new -> if (new > 0) { true } else { println("Rejected: $new is not positive") false } } positiveNumber = 10 println(positiveNumber) positiveNumber = -5 println(positiveNumber)

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

Int 10 Rejected: -5 is not positive Int 10

Пример

Создадим свойство для возраста, которое не позволяет установить значение меньше 0 или больше 150:

var age: Int by vetoable(18) { old, new -> if (new in 0..150) { true } else { println("Rejected: $new is not a valid age") false } } age = 25 println(age) age = 200 println(age)

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

Int 25 Rejected: 200 is not a valid age Int 25

Пример

Использование полной сигнатуры с параметром property:

var userName: String by vetoable("") { prop, old, new -> if (new.length >= 3) { println("Property ${prop.name} changed from '$old' to '$new'") true } else { println("Rejected: username must be at least 3 characters") false } } userName = "John" println(userName) userName = "Ab" println(userName)

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

Property userName changed from '' to 'John' String "John" Rejected: username must be at least 3 characters String "John"

Пример

Создадим свойство для email с проверкой формата:

var email: String by vetoable("") { old, new -> if (new.contains("@") && new.contains(".")) { true } else { println("Rejected: '$new' is not a valid email") false } } email = "test@example.com" println(email) email = "invalid-email" println(email)

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

String "test@example.com" Rejected: 'invalid-email' is not a valid email String "test@example.com"

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

  • функцию observable,
    которая отслеживает изменения свойств без возможности отмены
  • класс Lazy,
    который обеспечивает ленивую инициализацию свойств
  • интерфейс MutableList,
    который представляет изменяемую коллекцию элементов
  • класс Pair,
    который представляет пару значений
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить