Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
25 Окт 2022
7 мин
1528

Kotlin for Android — обзор на популярный язык программирования

Kotlin лучше Java? Как такой молодой язык программирования смог набрать популярность? В статье рассказываем о преимуществах Kotlin, разбираем примеры и сравниваем

Kotlin лучше Java? Как такой молодой язык программирования смог набрать популярность? В статье рассказываем о преимуществах Kotlin, разбираем примеры и сравниваем синтаксис с Java.

Что такое Kotlin

Kotlin — кросс-платформенный, объектно-ориентированный, статически типизированный язык программирования общего назначения. Это язык, в котором собрали все преимущества Java и убрали все его недостатки.

Код на Kotlin можно компилировать в байт-код JVM, транспонировать в JavaScript и даже компилировать для нативной работы без виртуальной машины.

В 2019 году, на конференции Google I/O, команда Android объявила, что Kotlin будет основным языком программирования для приложений под Android.

Преимущества

Компиляция в байт-код JVM и импорт Java-кода

Компиляция в байт-код позволит запускать код на Kotlin в любой среде, где доступна JVM. Kotlin умеет нативно импортировать Java-код — это дает возможность использовать любые существующие фреймворки, библиотеки или бизнес-логику.

Умная компиляция

Компилятор Kotlin помогает найти ошибки в момент компиляции, а не в момент выполнения программ. А анализатор кода поможет найти неинициализированные переменные и возможные утечки памяти.

Нацеленность на продуктивность разработчика

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

Некоторые паттерны программирования встроены в сам язык: Singleton, Companion object и Delegated properties. Всё это создается в интуитивном синтаксисе, который можно легко применять.

Что нужно для начала работы

Исходный код компилятора Kotlin открыт и доступен на github. Есть две опции компиляции и запуска кода, написанного на Kotlin:

Сгенерированный проект в IntelliJ IDEA содержит файл с функцией main:

fun main(args: Array<String>) {
    println("Hello World!")

    // Try adding program arguments via Run/Debug configuration.
    // Learn more about running applications: https://www.jetbrains.com/help/idea/running-applications.html.
    println("Program arguments: ${args.joinToString()}")
}

В отличие от Java, где доступен только объектно-ориентированный код, Kotlin поддерживает процедурное программирование и позволяет создавать функции вне классов.

Если хотите сначала изучить Java, приходите на курс Skypro «Java-разработчик». Узнаете, как проектировать архитектуру приложений, разрабатывать информационные системы и оптимизировать работу сайтов. Выполните практические проекты, получите диплом и гарантию трудоустройства.

Как работает Kotlin

Разберем необходимый минимум для начала работы.

Переменные

Различия между Java и Kotlin начинаются уже с синтаксиса объявления переменных:

var <имя переменной>:<тип переменной> = <значение>

и констант:

val <имя переменной>:<тип переменной> = <значение>

Базовые типы, доступные из коробки:

  • числа (Float, Double, Byte, Short, Int, Long и их беззнаковые аналоги);
  • boolean;
  • char;
  • строки;
  • массивы.

Все базовые объекты в Kotlin — классы.

Null-безопасность

Предыдущий пример создания переменной подразумевает, что в нее нельзя записать null. Такой код выдаст ошибку при попытке его скомпилировать:

var nonNullVariable:Int = null

Синтаксис объявления переменной, которая может принимать null:

var nullableVariable: int? = null

Используя такой тип переменных, мы можем создавать более безопасный код:

println(nullableVariable?.toString())

Метод toString будет вызван только в случае, если nullableVariable не содержит null.

Методы

Синтаксис для объявления процедур и методов:

fun <имя метода>(<список аргументов>):<тип возвращаемого значения> {
  <тело функции>
  return <возвращаемое значение>
}

Если тип возвращаемого значения не указан, функция будет объявлена как void.

Циклы

У Kotlin есть три типа циклов:

  • for, 
  • while, 
  • do-while. 

Цикл for позволяет перебирать элементами коллекций:

val items: IntArray = intArrayOf(1, 2, 3)
for (item: Int in items) {
  println(item)
}

либо диапазоном чисел:

for (item: Int in 1..3) {
  println(item)
}

while- и do-while-циклы работают аналогично циклам в Java.

var index: Int = 1
while (index >= 3) {
  println(index)
  index += 1
}

do {
 println("this text will be printed only once")
} while (false)

Классы

Синтаксис объявления классов был унаследован от Java:

class <имя класса> {
}

Чтобы познакомиться с Java, приходите на курс Skypro «Java-разработчик». На реальных задачах научитесь работать с классами, кодом, библиотеками, коллекциями. Опытные преподаватели объяснят всё доступным языком с примерами из своей практики. А наставники ответят на вопросы и помогут справиться со сложными заданиями.

По умолчанию будет создан final class, который нельзя унаследовать. Чтобы класс был доступен для наследования, нужно добавить ключевое слово open:

open class Base {
}

class Derived : Base() {
}

Классы в Kotlin могут иметь один и более конструкторов. Главный конструктор объявляется в сигнатуре самого класса:

open class Base constructor(firstProperty: Int, secondProperty: Int) {
}

class Derived : Base {
    constructor(firstProperty: Int, secondProperty: Int) : super(firstProperty, secondProperty)
}

Все дополнительные конструкторы могут быть перечислены в теле самого класса:

open class Base constructor(firstProperty: Int, secondProperty: Int) {
    constructor(firstProperty: Int) : this(firstProperty, 0)
}

class Derived : Base {
    constructor(firstProperty: Int, secondProperty: Int) : super(firstProperty, secondProperty)
    constructor(firstProperty: Int) : super(firstProperty)
}

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

open class Base constructor(firstProperty: Int, secondProperty: Int) {
    constructor(firstProperty: Int) : this(firstProperty, 0)

    init {
        println("Base class was just created")
    }
}

Если таких блоков несколько, они будут выполнены в том порядке, в котором объявлены в теле класса:

open class Base constructor(firstProperty: Int, secondProperty: Int) {
    constructor(firstProperty: Int) : this(firstProperty, 0)

    init {
        println("Base class was just created")
    }

    init {
        println("this init block executed later")
    }
}

Отличия от Java

Kotlin проектировали как преемника Java — его более современную версию — и добавили в него новые конструкции, недоступные в Java.

Если вы не знакомы с функционалом Java, запишитесь на курс Skypro «Java-разработчик». Освоите релевантные навыки, составите портфолио и получите диплом установленного образца.

Extension functions

Extension functions позволяют расширять классы новыми методами. Это статически типизированные методы, которые можно вызывать как другие методы класса:

class ExtendMe {
}

fun ExtendMe.extension() {
    println("Extension function for ExtendMe class")
}

fun main(args: Array<String>) {
    val instance:ExtendMe = ExtendMe()
    instance.extension()
}

Форматирование строк

Вот как выглядит форматирование строки средствами самого языка:

val number: Int = 10
val bit: Boolean = false
println("number: $number, bit: $bit")
println("calculated hash code: ${number.hashCode()}")

Корутины

Корутины — это неблокирующие функции, которые позволяют писать асинхронный код:

fun nonBlockingMethod() = runBlocking {
    launch {
        delay(1000L)
        println("this text will be printed later")
    }
    println("text to print first")
}

Делегирование

Альтернатива наследованию, позволяет передавать ответственность за выполнение методов другому классу:

interface IBase {
    fun print()
}

class BaseImplementation() : IBase {
    override fun print() {
        println("BaseImplementation class")
    }
}

class Derived(baseInstance: IBase) : IBase by baseInstance

fun main(args: Array<String>) {
    val instance: BaseImplementation = BaseImplementation()
    Derived(instance).print()
}

Data-классы

Позволяют создавать классы, которые предназначены исключительно для хранения данных:

data class Storage(val type: String, val size: Int)

Перегрузка операторов

Операторы можно научить работать с классами:

class Number constructor(val value: Int) {
    operator fun plus(other: Int): Number {
        return Number(value + other)
    }

    override fun toString(): String {
        return this.value.toString()
    }
}

fun main(args: Array) {
println("5 + 10 is ${Number(5) + 10}")
}

Подборка обучающих материалов

У Kotlin подробная документация, которая поможет стартовать в изучении языка. Есть неофициальная версия на русском языке.

Компания Google подготовила материал по созданию приложений для Android. В нём — базовые примеры языка и детали, специфичные для Android.

А еще у Kotlin большое сообщество, которое собирает разные курсы и помогает в обучении.

Коротко о главном

Kotlin — отлично спроектированный язык программирования с большой аудиторией. Его популярность растет не только в устройствах на Android, но и в серверной разработке, вытесняя Java.

Программисты на Kotlin уже сейчас востребованы на рынке. Только на хедхантере больше 700 вакансий — и количество будет расти.

Добавить комментарий