В мае 2017 года Google объявил, что делает Kotlin, язык JVM, первоклассным языком для разработки под Android. Это привлекло мое внимание, и я начал изучать Котлин. Kotlin - это язык с открытым исходным кодом, разработанный JetBrains, компанией, которая разрабатывает популярные IDE, такие как Intellij IDEA и Webstorm.

Вот обзор некоторых особенностей языка в отличие от Java.

1. Просто, кратко и легко начать работу с

Вы когда-нибудь пробовали писать код Hello World на Java?
Вот как это выглядит

public class HelloWorld {
   public static void main(String[] args) {
     System.out.println(“Hello World!”);
   }
}

Для опытного Java-разработчика это может показаться простым делом.
Но для новичка в этом языке это слишком многословно.
Здесь много шума.
Что является общедоступным? Что такое класс? Что такое статика? Что такое System.out?
Все это для того, чтобы просто напечатать «Hello World»?

И Java полна такого многословия.

Вот как выглядит Kotlin Hello World

fun main() {
    println(“Hello World”)
}

Здесь все еще есть некоторые концепции, например веселье - это функция, а main - это отправная точка для приложения.
Но это абсолютный минимум для запуска приложения, которое на любом языке.

Вот еще один пример.
Эта программа анализирует текст и печатает следующие
1. Слова, начинающиеся с гласной
2. Слова, начинающиеся с согласной
3. Подсчет слов

fun main(args: Array<String>) {
         val text = """
            Global warming is a long-term rise in the average        temperature of the Earth's climate system,
            an aspect of climate change shown by temperature measurements and
            by multiple effects of the warming.
        """
        val words = text.trimIndent().split(Regex("\\s"))
        val startsWithAVowel = words.filter { word ->
            listOf('a', 'e', 'i', 'o', 'u')
            .any { word[0].toLowerCase() == it }
        }
        val startsWithAConsonant = 
            words.filter { !startsWithAVowel.contains(it) }
        println("Starts with a vowel => $startsWithAVowel")
        println("Starts with a consonant => $startsWithAConsonant")
        val wordCount = words
                         .groupBy { it }
                         .map { it.key to it.value.count() }
        println("Word count => $wordCount")
}

Попробуйте написать приведенный выше код на Java, и вы поймете, почему Kotlin лаконичен.

2. Отсутствие мнения о парадигме

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

3. Статически типизированный

Kotlin имеет статическую типизацию, что означает, что тип переменной определяется во время компиляции.
например Java, Scala имеют статическую типизацию, тогда как языки, такие как Javascript, Groovy и Python, типизируются динамически.
Статическая типизация позволяет избежать случайных ошибок типа.
Но что мешает статической типизации стать подробным, так это строгий вывод типов в Kotlin
например

val msg = “Hello”

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

msg = 10

Здесь происходит сбой компиляции.
Также компилятор будет жаловаться, если не сможет определить тип переменной
, например,

fun hello(msg) {
    println(msg)
}

который нужно записать как

fun hello(msg: String) {
    println(msg)
}

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

Любой Java-разработчик имел дело с методами класса Object по умолчанию
вроде
toString () - получает строковое представление объекта
equals () - сравнивает один объект класса с другим
hashCode () - дает хэш-код объекта на случай, если вам нужно использовать его в качестве ключа в HashMap (пара ключ-значение)

Все Java IDE имеют быстрые ярлыки для генерации этих методов для вас, и есть библиотеки, такие как lombok, которые изменяют байтовый код для его генерации.

Вот пример Java

class Person{
    String name;
    String email;
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name) &&
                Objects.equals(email, person.email);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, email);
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

У Kotlin есть лучший способ - классы данных

data class Person(val name: String, val email: String)

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

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

5. Шаблон проектирования Singleton

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

Вот как выглядит реализация Java.

public final class MyClass {
 
    private static MyClass INSTANCE;
     
    private MyClass() {        
    }
     
    public static MyClass getInstance() {
        if(INSTANCE == null) {
            INSTANCE = new MyClass();
        }    
        return INSTANCE;
    }
}

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

Есть и другой способ использования enum.
А код Kotlin выглядит так:

object MyClass{
    init{
        
    }
}

Просто добавьте к нему префикс object
. Для этого не нужно использовать Google или stackoverflow!

6. Функции расширения

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

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

fun String.isACity() = arrayListOf(
                        "London","New York","Mumbai").contains(this)
println("London".isACity()) // true
println("xyz".isACity()) // false

7. Безопасность - null и неизменяемость

Неизменяемость

Случайная изменчивость привносит странные ошибки и отнимает у
время на отладку. Изменяемость также может сделать код излишне сложным и трудным для отладки.
В Java (и я думаю, в большинстве языков) по умолчанию переменная изменяема, и если вам нужно сделать ее неизменной, вам нужно добавить final перед ней

final String a = "xyz";

Добавление final для каждой переменной является подробным и может быть легко пропущено.

В Kotlin есть два ключевых слова:
val и var
val - неизменяемая переменная.

val a = "abc"
a = "pqr" // this will fail to compile

и var для изменяемой переменной

var b = "abc"
b = "pqr" // this compiles fine

Таким образом, вы используете val в большинстве случаев и var, когда это абсолютно необходимо.
Параметры метода в Kotlin также неизменяемы.

Нулевой указатель

NullPointerException - одно из наиболее часто наблюдаемых исключений
в рабочих журналах Java. И это может быть действительно неприятно и сложно отлаживать, в зависимости от того, где это происходит в коде.
Он выдается, когда вы пытаетесь разыменовать объект, который не имеет ссылки (или имеет значение NULL). Даже человек, создавший эту концепцию, назвал это ошибкой на миллиард долларов.

Типы Kotlin делятся на 2 категории -
Nullable и Non-Nullable.

По умолчанию типы не допускают значения NULL
например

var a: String = "abc"
a = null // compilation error

Если вам нужен тип, допускающий значение NULL, вы должны явно указать ? в конце
типа.

var b: String? = "abc"
b = null // ok

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

8. Язык JVM

Как разработчику Java вам не нужно покидать мир JVM.
Kotlin совместим с Java. Он был разработан с учетом взаимодействия с Java.
Вы можете вызывать код Java из Kotlin и наоборот.

Кроме того, у него нет большой кривой обучения, в отличие от некоторых других языков JVM, таких как Scala.

9. Растущее сообщество

Сообщество Kotlin постоянно растет. Также вы получаете выгоду от множества уже существующих java-библиотек.
Spring boot и Gradle уже добавили поддержку Kotlin.
Все больше и больше приложений для Android пишутся с использованием Kotlin.
Его можно перенести на Javascript, а также доступен в нативном.

Kotlin вдохновлен другими языками программирования и имеет
полезные функции. например Такие вещи, как data clasess, val, var, object, похоже, вдохновлены Scala.
Это действительно язык программирования общего назначения.

С праздником Котлин !!!

(Хлопайте в ладоши, если вам это понравилось!)