В мае 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.
Это действительно язык программирования общего назначения.
С праздником Котлин !!!
(Хлопайте в ладоши, если вам это понравилось!)