Применяем Kotlin Coroutines в боевом Android-проекте

super() – это встроенная функция языка Python. Она возвращает прокси-объект, который делегирует вызовы методов классу-родителю (или собрату) текущего класса (или класса на выбор, если он указан, как параметр).

Множественное наследование

В случае множественного наследования super() необязательно указывает на родителя текущего класса, а может указывать и на собрата. Все зависит от структуры наследования и начальной точки вызова метода. Общий принцип остается: поиск начинается с предыдущего класса в списке MRO. Давайте рассмотрим пример ромбовидного наследования. Каждый класс ниже в методе method печатает свое имя. Плюс все, кроме первого, вызывают свой super().method():

class O: def method(self): print(‘I am O’) class A(O): def method(self): super().method() print(‘I am A’) class B(O): def method(self): super().method() print(‘I am B’) class C(A, B): def method(self): super().method() print(‘I am C’)

Если вызвать метод C().method(), то в терминале появится такая распечатка:

# C().method() I am O I am B I am A I am C

Видно, что каждый метод вызывается ровно один раз и ровно в порядке MRO. C вызывает родителя A, а A вызывает своего брата B, а B вызывает их общего родителя O. Но! Стоит нам вызвать A().method(), он уже не будет вызывать B().method(), так как класса B нет среди его родителей, он брат, а родитель у класс А только один – это O. А о братьях он и знать не хочет:

# A().method() I am O I am A

Таким образом, вызов super() сам автоматически догадывается, к кому обращаться: к родителю или к брату. Все зависит от иерархии класса и начальной точки вызова. Эта фишки снимают с программиста головную боль, связанную с заботой о поддержании цепочки вызовов в иерархии классов.

2 121

«Уроки Kotlin» от itProger

Пройти курс

Длительность: 12 уроков с бессрочным доступом.

Сертификат: нет.

Формат обучения: видеоуроки, материал для самостоятельного изучения, тестовые задания.

Программа обучения: рассчитана на слушателей, желающих освоить язык Kotlin с нуля. Курс поможет понять основы языка, и научиться использовать его для создания Android-приложений.

Читайте также:  Gorilla Glass: все, что нужно знать о защитном стекле смартфона

Какие знания и навыки получите:

«Уроки Kotlin» от itProger
  • Переменные и типы данных.
  • Создание классов и объектов.
  • Создание и применение функций.
  • Работа с массивами данных.
  • Работа с классами, объектами, интерфейсами.
  • Разработка простой программы

Плюсы:

  • Материал доступен без регистрации.
  • Прохождение в удобное время.
  • Каждый урок сопровождается примерами.

Минусы:

  • Выполнять задания и получать консультации можно только после оплаты подписки.

Ключевые особенности типов данных и операций в Kotlin

  • Преобразование типов позволяет конвертировать значения из одного типа в другой;
  • Kotlin будет преобразовывать типы за вас при использовании основных арифметических операторов (+, -, *, /), со смешанными типами;
  • Вывод типа позволяет не указывать тип, когда Kotlin уже знает его;
  • Unicode является стандартом для преобразования символов в числа;
  • Отображение символа в Unicode называется кодовой точкой;
  • Тип данных Character хранит одиночные символы. Тип данных String хранит наборы символов или строк;
  • Можно комбинировать строки с помощью оператора сложения +;
  • Можно использовать строковые шаблоны для быстрого создания строки с использованием в ней разных переменных или выражений;
  • Типы Pair и Triple используются для группировки разных данных в один тип;
  • В Kotlin есть много числовых типов с различными возможностями хранения и точностью;
  • Any является матерью всех типов, но не для Null-значений, Unit похож на void в Java, а Nothing, как можно понять по названию является ничем, ничего не вернет и не должен.

Что дальше?

Типы является фундаментальной частью программирования. Именно они позволяют правильно хранить ваши данные. Мы рассмотрели строки, Pair и Triple, а также множество числовых типов. Позже в обучающем курсе вы узнаете, как создавать свои собственные типы с помощью классов, перечислений и интерфейсов.

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

Когда нужен асинхронный подход

Вернемся к нашей задаче использования корутин. Приложение под Android, над которым мы сейчас работаем, общается с сервером и хранит информацию в базе данных. На первый взгляд, ничего нового по функционалу, но интересен сам подход в реализации, поскольку тестируем новый инструмент разработки асинхронного кода — корутины Kotlin.

Читайте также:  Что такое HDR в камерах телефона и дисплеях

В своем приложении мы применяем асинхронный код. Почему? Дело в том, что общение с сервером и запросы в базу данных — довольно продолжительные операции. Пока выполняется одна, вполне можно успеть завершить еще несколько, не блокируя основной поток. Именно эту задачу и решает асинхронный подход. В случае синхронного программирования операции выполняются последовательно, т.е. следующая команда запускается только после того, как завершится предыдущая, и когда какая-нибудь из них выполняется слишком долго, программа может зависнуть. И хотя все понимают, что “зависание” вряд ли понравится пользователям, все же такую реализацию иногда можно встретить в приложениях. Повторюсь, мы решаем задачу с помощью асинхронного кода.

Как организован процесс обучения

Вебинары проходят в мессенджере Slack — там же взаимодействуют преподаватели и сокурсники. Раз в две недели вам придётся делать домашнее задание, рассчитанное на 3-4 часа свободного времени. При выполнении задач слушатели всегда могут получить обратную связь от менторов. Все лекции сохраняются в личном кабинете и доступны даже после обучения. Финальный месяц курса посвящён выполнению индивидуального проекта, который станет достойной частью вашего портфолио. Самые успешные выпускники получат приглашение на собеседование в партнёрские компании — OZON, «МТС», X5 Retail Group и многие другие.

Деструктор

Работа с деструктором, как правило, является прерогативой языков, предоставляющих более широкие возможности для управления памятью. Несмотря на грамотную работу сборщика мусора, обеспечивающего своевременное удаление ненужных объектов, вызов деструктора все еще остается доступным. Переопределить его можно в классе, задав имя __del__.

class Data: def __del__(self): print «The object is destroyed» data = Data() del(data) The object is destroyed

Как и конструктор, деструктор может содержать некий пользовательский код, сообщающий об успешном завершении работы метода. В данном примере создается экземпляр класса Data и вызывается его деструктор, принимающий в качестве параметра сам объект.

Абстрактные методы и классы

Если класс объявлен с ключевым словом abstract , то он называется абстрактным классом. Он может иметь, а может и не иметь абстрактных методов.

Java abstract class Monster { }

Читайте также:  ZyXEL Keenetic: как войти в настройки роутера (my.keenetic.net)
12 abstract class Monster {}

Абстрактным методом называется метод, объявленный с ключевым словом abstract и не имеющий тела метода.

Java abstract void myAbstractMethod(int myParam1, double myParam2);

1 abstract void myAbstractMethod(int myParam1, double myParam2);

Если в классе есть абстрактные методы, то он ДОЛЖЕН быть объявлен абстрактным.

Нельзя создать экземпляр абстрактного класса, но можно указать абстрактный класс в качестве базового класса.

Дочерний класс от абстрактного класса должен либо дать реализацию всем его абстрактным методам, либо сам быть абстрактным классом.

Абстрактные классы очень похожи на интерфейсы, но абстрактные классы могут иметь поля экземпляров и могут иметь методы с модификатором доступа отличным от public. Также вы можете наследовать свой класс только от одного другого класса, но вы можете реализовать любое количество интерфейсов.

Выбрать между абстрактным классом и интерфейсом бывает довольно сложно. Старайтесь руководствоваться правилами, описанными ниже.

Используйте абстрактные классы, если:

  • Вы хотите использовать общий код в нескольких близко связанных классах.
  • Вы ожидаете, что классы, которые будут наследоваться от вашего абстрактного класса, имеют большое количество общих полей или требуют использования модификаторов доступа отличных от public.
  • Вам нужно объявить поля экземпляров или класса, а не только константы.

Используйте интерфейсы в следующих ситуациях:

  • Вы ожидаете, что интерфейс будут реализовывать не связанные друг с другом классы. Интерфейсы Comparable и Cloneable , например, реализует очень большое количество совершенно разных классов.
  • Вы хотите указать поведение определённого типа, но вам абсолютно не важно, кто будет реализовывать это поведение.
  • Вам нужно множественное наследование типов.

Для примера абстрактного класса представьте ситуацию, что вам нужно реализовать несколько различных видов монстров: Goblin , Hobgoblin , Orc , Gremlin и Genie. Каждый из эти монстров имеет свои различные особенности, которые будут реализовываться в соответствующем классе, но все эти монстры будут уметь ходить и иметь координаты в пространстве, и у каждого из них будет уровень здоровья. В этом случае можно заложить умение ходить, координаты и уровень здоровья в базовом классе Monster, который сделать абстрактным, и в котором объявить абстрактные методы для управления повадками и прочими вещами, реализации которых будут в соответствующих дочерних классах.

Цикл статей «Учебник Java 8».

Следующая статья — «Java 8 перечисления». Предыдущая статья — «Java 8 интерфейсы».