Kotlin — ещё меньше копипасты с делегатами локальных переменных

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

TLDR: используем имя переменной при инициализации ее значения

Допустим, в тесте нужно создать некоторое количество однотипных объектов, у которых есть характерное отличие в одном строковом свойстве. Для примера возьмем класс Color.

data class Color(val value: String)

Создадим несколько экземпляров, дадим переменным осмысленные имена.

val red = Color("red")
val green = Color("green")
val blue = Color("blue")

Имена переменных дублируют параметр конструктора. Копипаста. Давайте ее изживём.

val red by color()
val green by color()
val blue by color()

println(red.value)   // "red"
println(green.value) // "green"
println(blue.value)  // "blue"

Разберемся, что тут происходит.

Ключевое слово by подсказывает - функция color() возвращает делегат - объект со специальным методом, которому адресуется чтение свойства или локальной переменной. Второй параметр метода - это описание свойства, откуда можно узнать имя переменной.

Устройство делегата тривиально - при первом обращении к переменной создаем наш объект, запоминаем его и возвращаем, при последующих вызовах возвращаем его же.

class ColorDelegate {
    
  private var color: Color? = null
  
  operator fun getValue(thisRef: Nothing?, property: kotlin.reflect.KProperty<*>): Color {
    val res: Color = color ?: Color(property.name)
    color = res
    return res
  }
}

fun color(): ColorDelegate {
  return ColorDelegate()
}

Функция color() решает только эстетическую задачу, вместо ее вызова можно явно создавать ColorDelegate.

Спасибо! )

Источник: https://habr.com/ru/post/675552/


Интересные статьи

Интересные статьи

Подробно с демонстрацией своего кода рассказываю то, как я реализовал в своем приложении на Kotlin добавление, редактирование, удаление и чтение событий из Google календаря при помощи Content Provider...
Студенты и сотрудники лаборатории Машинного обучения Университета ИТМО разработали библиотеку для Python, которая решает ключевую задачу машинного обучения. Расскажем, почему появи...
Разработка LED-драйвера – интересная и комплексная задача. Рынок в этом направлении весьма насыщен – иногда кажется, что производство светодиодных светильников везде. Начиная от гаража и заканчив...
Пару лет назад было много блог-постов «смотрите, какой интересный язык Kotlin», где объяснялись основы. В 2019-м разжёвывать азы уже не требуется, зато теперь появляется публикация совсем дру...
По мере того, как растёт сложность клиентских приложений, размеры их бандлов становятся всё больше и больше. В этой ситуации сильнее всего страдают люди, вынужденные, по разным причинам, пользова...