Что ж, в своих беседах со многими Android-разработчиками чаще, чем пару раз, я сталкивался с вопросом, а почему Kotlin?

Теперь, если вы спросите кого-нибудь, кто работал с Java, а теперь перешел на Kotlin, для сравнения, обычным ответом будет что-то вроде «Fiat», который теперь обновлен до Range Rover. Да, Kotlin мощный, и я собираюсь рассказать о нескольких функциях, которые мне в нем нравятся!

Статически типизированный язык
Начнем с того, что Kotlin — это статически типизированный язык, поддерживающий вывод типов. Вау! Чтобы разобрать это, Kotlin проверяет тип переменной во время компиляции, а не во время выполнения, что упрощает обнаружение ошибок до успешной компиляции. Он также автоматически определяет тип данных переменных, избегая явного объявления типа переменной.

var justAnotherString = "Hello, little Toe"
val justAnotherInteger = 27

Функции расширения
Это одна из моих любимых функций. Kotlin позволит вам расширить функциональность классов, не касаясь их кода. Например, мы можем добавить мощности скромному классу String, просто добавив к нему функции расширения,

fun String.showToast(context:Context){
    Toast.makeText(context, this, Toast.LENGTH_SHORT).show()
}

с помощью которого вы сможете добавить функцию showToast() к любой строке, просто добавив функцию showToast(), которая принимает параметр контекста.

"Hey there!".showToast(this)

Функции расширения выходят далеко за рамки простого отображения всплывающих уведомлений, но об этом я расскажу в другом блоге.

Классы данных

Одна из самых распространенных вещей, которые я делал, — это создание пользовательских классов в Java, также называемых POJO, для хранения и извлечения данных. В основном это означало создание класса с кучей переменных, геттеров и сеттеров. Это выглядело примерно так.

class Person{
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

В Котлине вы можете добиться того же, написав что-то вроде этого.

data class Person(val name: String, val age: Int)

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

Больше нет findViewById

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

apply plugin: 'kotlin-android-extensions'

теперь в вашем методе onCreate вы можете напрямую ссылаться на переменную. Вам больше не нужно явно объявлять представление или создавать глобальные переменные.

Скажем, ваш xml-файл имел такой вид,

<TextView
    android:id="@+id/tv_name"
    android:text="Rahul"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<TextView
    android:id="@+id/tv_profession"
    android:text="Guitarist"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

все, что вам нужно для доступа и редактирования, будет следующим

import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        tv_name.text = "Simran"
        tv_profession.text = "Android Developer"
        //And thats all!
    }
  
}

Нулевая безопасность

Kotlin очень тяжело борется с битвой NPE (исключение нулевого указателя). По умолчанию Kotlin не допускает нулевое значение ни в одной переменной.

var name:String = null //this will not compile

Чтобы разрешить нулевое значение в переменной, вам нужно добавить оператор ? после объявления переменной. Что-то вроде этого.

var name:String? = null

Поэтому в следующий раз, когда вы попытаетесь получить доступ или передать значение переменной name, вам придется сделать что-то вроде этого

println(name?.length) //this will print 'null'
println(name!!.length) //this will throw a NPE exception

используя оператор ?., он же оператор безопасного вызова, Kotlin обрабатывает исключение NPE и возвращает null в логи.

оператор утверждения !! not null выдаст исключение NPE, как это сделала бы старая добрая Java. Это для людей, которые все еще хотят, чтобы NPE был частью их жизни.

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

var name:String = null
println(name?.length ?: -1) //this will print -1
name = "Susanne"
println(name?.length ?: -1) //this will print 7

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

Ваше здоровье.