Рубрики
Без рубрики

Делегированные свойства в Котлине

В этом учебном пособии, написанном Аанандом Шекхаром Роем и Раши Каранпурией, рассматриваются делегированные свойства, основное обновление в выпуске Kotlin 1.1.

Автор оригинала: PACKT.

В этом учебном пособии, написанном Аанандом Шекхаром Роем и Раши Каранпурией, рассматриваются делегированные свойства, основное обновление в выпуске Kotlin 1.1. Ананд Шекхар Рой и Раши Каранпурия также являются авторами Кулинарной книги по программированию Котлина которые изучают программирование на Android и веб-разработку, понимая концепции программирования Kotlin.

Котлин пожирает мир Java. Он уже стал хитом в экосистеме Android (в которой доминировала Java) и везде был встречен с распростертыми объятиями. На этом этапе следует отметить, что Kotlin не ограничивается только разработкой Android и может использоваться для разработки серверных и клиентских веб-приложений. Кроме того, Kotlin на 100% совместим с JVM, поэтому вы можете использовать любые существующие платформы, такие как Spring Boot, Vert.x или JSF, для написания приложений Java.

Выпуск версии Kotlin 1.1 во многом помог освоению Kotlin. Он включал несколько существенных обновлений; одним из наиболее важных из них были делегированные свойства.

Работа с делегированными свойствами

Существует три типа делегированных свойств, которые теперь помещены в библиотеку, чтобы их можно было реализовывать каждый раз, когда они нам понадобятся. Они являются:

• ленивый: Ленивые свойства оцениваются первыми, и после них возвращается один и тот же экземпляр, во многом похожий на кэш • наблюдаемый: прослушиватель получает уведомление всякий раз, когда вносятся изменения • карта: Свойства хранятся на карте, а не в каждом поле

В этой статье мы рассмотрим, как работать с этими делегатами. Итак, давайте начнем!

Готовиться

Мы будем работать над кодом для Android, поэтому вам потребуется Android Studio 3.

Как это сделать…

Давайте рассмотрим простой пример делегированного свойства:

  1. Во-первых, мы будем работать со свойством ленивого делегата. Проще говоря, этот делегат может приостановить создание объекта до тех пор, пока мы не получим к нему доступ в первый раз. Это действительно важно, когда вы работаете с тяжелыми объектами; их создание занимает много времени—например, при создании экземпляра базы данных или, возможно, компонентов dagger. Мало того, результат запоминается, и то же значение возвращается при последующих вызовах GetValue() для такого делегированного свойства. Давайте рассмотрим пример:

переопределить fun onCreate(сохраненное состояние: Пакет?) { кнопка super.onCreate(savedInstanceState) val от lazy { findViewById<Кнопка>(R. id.submit_button) } setContentView(R. layout.activity_main) }

  1. Предыдущее является стандартным методом создания действия. Если вы посмотрите внимательно, мы установили переменную button перед методом setContentView (..). Когда вы запускаете его, он работает идеально. Если бы вы не использовали lazy, это дало бы исключение NullPointerException, что-то вроде этого:

Вызвано: java.lang. Исключение NullPointerException: Попытка вызвать виртуальный метод “void android.widget. Button.setText(java.lang. CharSequence)’ по нулевой ссылке на объект

  1. Переменная button была нулевой, как мы называли ее до представления setContent. Однако это не было проблемой с лениво созданным объектом button, потому что, хотя мы объявили его до setContentView, объект button не был создан. Он был создан после первого доступа, то есть когда мы попытались установить для него свойство.

  2. Таким образом, при использовании ленивой конструкции вам не нужно думать о том, где разместить свой код для инициализации, и инициализация объекта откладывается до его первого использования.

Еще одна важная вещь, которую следует отметить, заключается в том, что по умолчанию оценка ленивых свойств будет синхронизирована, что означает, что значение вычисляется в одном потоке, а остальные потоки будут видеть одно и то же значение. Существует три типа инициализации:

• Режим LazyThreadSafetyMode. СИНХРОНИЗИРОВАНО: Это режим по умолчанию, который гарантирует, что только один поток может инициализировать экземпляр. • Режим LazyThreadSafetyMode. ПУБЛИКАЦИЯ: В этом режиме инициализация может выполняться несколькими потоками. • Режим LazyThreadSafetyMode. НИКТО: Этот режим используется, когда мы уверены, что инициализация произойдет только в одном потоке. Например, в случае Android мы можем быть уверены, что представления будут инициализироваться только потоком пользовательского интерфейса. Поскольку это не гарантирует потокобезопасность, у него гораздо меньше накладных расходов.

Еще одним полезным делегатом является наблюдаемый делегат. Этот делегат помогает нам отслеживать любые изменения в свойстве. Например, давайте рассмотрим очень простую реализацию наблюдаемого делегата:

fun main(args: Массив<Строка>) { val() } перемещение по классу { Имя места var:Строка делегатов.наблюдаемый(“<>”){ свойство, значение oldValue, новое значение -> println(“Значение oldValue = $значение oldValue, новое значение = $значение newValue”) } }

Это и есть результат:

Старое значение = <>, ,

Как мы видим, наблюдаемый делегат принимает две вещи: значение по умолчанию (которое мы указали как <>) и обработчик, который вызывается всякий раз, когда это свойство изменяется.

Давайте теперь поработаем с делегатом, на которого наложено вето. Это очень похоже на наблюдаемый делегат, но, используя его, мы можем “наложить вето” на изменение. Взгляните на этот пример:

fun main(args: Массив<Строка>) { val() println(париж.название места) } путешествие в классе { var Имя места:Строка делегатов.ветируемое(“<>”){ свойство, старое значение, новое значение -> если(!Новое значение.равно(“Париж”)){ возврат@vetoable false } true } }

Это и есть результат:

Париж

Как вы можете видеть в предыдущем примере, если новое значение не равно “Париж”, мы вернем значение false, и модификация будет прервана. Если вы хотите, чтобы произошла модификация, вам нужно вернуть значение true из конструкции.

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

fun main(args: Массив<Строка>) { val(карта( “название места” в “Париж” )) println(париж.название места) } путешествие классом(карта val:Карта<Строка,Есть?>) { имя места val: Строка по карте }

Вот результат:

Париж

Чтобы заставить его работать для свойств var, вам нужно использовать изменяемую карту, поэтому предыдущий пример может выглядеть примерно так:

fun main(args: Массив<Строка>) { val(Изменяемая карта Из( “название места” в “Париж” )) println(париж.название места) } путешествие классом(карта val:Изменяемая карта<Строка,Есть?>) { имя места var: Строка по карте }

Конечно, результат будет тот же самый.

Это еще не все…

Наблюдаемое делегированное свойство также может широко использоваться в адаптерах. Адаптеры используются для заполнения данных в каком-то списке. Обычно, когда данные обновляются, мы просто обновляем список переменных-членов в адаптере, а затем вызываем notifyDataSetChanged(). С помощью наблюдаемых и диффузных объектов мы можем просто обновлять то, что действительно изменилось, вместо того, чтобы менять все. Это приводит к гораздо более эффективной работе.

Кулинарная книга по программированию Котлина

Если вы хотите узнать больше о программировании на Android и веб-разработке, поняв концепции программирования на Kotlin, попробуйте Кулинарная книга по программированию на Kotlin от Аананда Шекхара Роя и Раши Каранпурии. Эта книга содержит быстрые решения распространенных проблем, возникающих при разработке приложений для Android.

9781788472142cov.. ( 1).png

Автор Аананд Шекхар Рой-независимый разработчик Android. Его карьера в области мобильной инженерии включает в себя работу в различных стартапах и компаниях, таких как нидерландский ConceptOffice и американские стартапы Сознательно. Жизнь и следующий фанат-Фэнтезийный ИндиКар.

Соавтор Раши Каранпура-профессиональный разработчик Android. Она начала свою карьеру, работая над приложением для кошелька для новозеландского финтех-стартапа. Она разработала проекты в различных областях, таких как IOT, AdTech, бизнес, социальные сети и потоковые приложения в реальном времени.

Оригинал: “https://www.codementor.io/@packt/delegated-properties-in-kotlin-kqda9rze4”