Я недавно написал статью о нововведениях в Kotlin 1.4.20. И первый комментарий оказался немного несправедливым по отношению к Kotlin.
Он утверждал, что зачем мол Kotlin в мобильной разработке, ведь есть Java, потому что это один из лучших языков программирования.
И ко всем этому очень много кода Android Framework написаны на Java, а точнее больше 50%!
Перед тем, как я поделюсь своим мнением и изложу сей рассказ, попрошу пожалуйста не бить меня стульями :)
Ну что ж, начнем со статистики!
Что говорят профессиональные разработчики?
Google провела небольшой опрос для тех разработчиков, которые используют Kotlin.
Результат такой:
67 % опрошенных профессиональных Android разработчиков, которые используют Kotlin, сказали, что он повышает их производительность!
Данные опроса выложила Florina Muntenescu (Android Developer Advocate)
Конечно в этот опрос входят не все, кто использует Kotlin, и вообще он не 100% точный.
Но такие моменты имеют немалый вес и их стоит учитывать, если вы начинаете свою карьеру в мобильной разработке.
Что говорят партнеры Google и другие компании, которые принимали участие в статистики?
Профессиональные Android разработчики указали на некоторые весьма важные характеристики Kotlin:
-
Краткость - меньше кода, меньше тестов и меньше времени на отладку. Такой код легче читать и поддерживать
-
Простота - несомненно Kotlin проще Java
Мнение одной из команд Flipkart:
Во время внутреннего опроса, 50% разработчиков отметили, что они сделали бы за меньшие сроки функционал приложения, если бы модуль был бы написан на Kotlin.
Немного статистики от компании Cash App:
Когда команда Cash App начала использовать Kotlin, они избавились от Builder паттерн и сократили кол-во кода, который им нужно было написать (в некоторых случаях они сэкономили 25% на размере кода).
Также о краткости и лаконичности Kotlin говорят ребята из компании Zomato в этом видео
От компании Duolingo
Duolingo - это одна из самых популярных платформ для изучения иностранных языков и одно из наиболее загружаемых приложений в Google Play (более 100 млн. загрузок).
В прошлом их кодовая база увеличивалась каждый код на 46% (добавление новых функций, различные обновления библиотек и т.д.). Поэтому они приняли решение переписать приложение на Kotlin.
На это ушло порядка двух лет. Их усилия не прошли даром: несмотря на введение новых функций, они сократили свою кодовую базу до тех размеров, которые были 2 года назад!
Внутренние опросы показали, что удовлетворенность разработчиков возрасла, что неудивительно!
Они заметили один интересный факт: при конвертировании Java файла в Kotlin количество строк кода в среднем сокращается на 30%, а в некоторых случаях более чем на 90%!
Kotlin функциональность и продуктивность
В Android разработке на Java, чтобы указать необязательные параметры у конструктура вы должны сделать одно из двух:
1) Добавить множество конструкторов
2) Добавить Build паттерн
В Kotlin существуют значения по умолчанию, которые делают нашу жизнь проще.
Вот так выглядит страшный класс с использованием Builder паттерна на Java:
public class Task { private final String name; private final Date deadline; private final TaskPriority priority; private final boolean completed; private Task(String name, Date deadline, TaskPriority priority, boolean completed) { this.name = name; this.deadline = deadline; this.priority = priority; this.completed = completed; } public static class Builder { private final String name; private Date deadline; private TaskPriority priority; private boolean completed; public Builder(String name) { this.name = name; } public Builder setDeadline(Date deadline) { this.deadline = deadline; return this; } public Builder setPriority(TaskPriority priority) { this.priority = priority; return this; } public Builder setCompleted(boolean completed) { this.completed = completed; return this; } public Task build() { return new Task(name, deadline, priority, completed); } }}
Тот же самый класс на Kotlin (с дополнительной реализацией
hashCode(),
equals()
и некоторыми другими
плюшками):
data class Task( val name: String, val deadline: Date = DEFAULT_DEADLINE, val priority: TaskPriority = TaskPriority.LOW, val completed: Boolean = false)
Это впечатляет!
А вот ещё пример с применением паттерна Singleton на Java:
public class Singleton{ private static volatile Singleton INSTANCE; private Singleton(){} public static Singleton getInstance(){ if (INSTANCE == null) { // Single Checked synchronized (Singleton.class) { if (INSTANCE == null) { // Double checked INSTANCE = new Singleton(); } } } return INSTANCE; } private int count = 0; public int count(){ return count++; } }
На Kotlin:
object Singleton { private var count = 0 fun count(): Int { return count++ } }
Подобные вещи сильно упрощают разработку и помогают избавиться от шаблонного кода.
Kotlin предоставляет довольно мощные средства, которые обеспечивают высокую выразительность кода, вот взгляните:
fun borrow(){ library -= book // используется operator overloading val (title, author) = book // деструктуризация data класса println("Borrowed $title") // шаблон строки}
Помимо лаконичности и простоты, Kotlin вводит дополнительный синтаксис при работе с null ссылками:
var str: String? = null // Разработчик, знает, // что str может ссылаться на null println(str?.length) // Обращение происходит через Safe (?) оператор val len = str?.length ?: 0 // значение 0, если str ссылается на nullvar listOf: List<String>? = null // может ссылаться на nulllistOf?.filter { it.length > 3 } // можно использовать цепочки ?.map { it.length } ?.forEach { println("Length more 3 -> $it") }
А также в Android предусмотрены дополнительные расширения для Kotlin, которые позволяют сделать код меньше и проще, например:
@Injectlateinit var viewModelFactory: MyViewModelFactoryprivate val viewModel by viewModels<MyViewModel> { viewModelFactory }
Большинство современных библиотек поддерживают Kotlin расширения, например:
dependencies { implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'implementation "androidx.room:room-ktx:$room_version" implementation "androidx.paging:paging-runtime-ktx:$paging_version" }
Заключение
Java довольно мощный и высоко развитый язык, но по моему мнению, Kotlin в будущем будет использоваться более 95% мобильными разработчиками, а Java останется на заднем плане.
Но это не весомый аргумент тому, что о Java можно забыть в мобильной разработке, хотя по большей части можно :)
Даже если Kotlin заполонит весь рынок мобильной разработки, большинство компонентов Android Framework все равно написаны на Java и поэтому в редких случаях придется будет использовать Java.
Полезные ссылки: