JavaRush/Java блог/Random/KotlinRush: а есть ли смысл продолжать писать на Java?
NikEy
41 уровень

KotlinRush: а есть ли смысл продолжать писать на Java?

Статья из группы Random
участников
Привет, студент JavaRush, пока тебя целиком и полностью не поглотила Java, я хотел бы расширить твой кругозор и обратить внимание на набирающий популярность язык Kotlin!
KotlinRush: а есть ли смысл продолжать писать на Java? - 1
Kotlin — достаточно молодой язык, разработанный компанией JetBrains. Да-да, именно той самой компанией, которая разработала нашу любимую IDE: IntelliJ IDEA. Kotlin является JVM языком и полностью совместим с Java, то есть из Kotlin-кода можно без проблем обращаться к привычным Java-библиотекам, Да что там к библиотекам: Kotlin и Java классы могут уживаться в одном package! Kotlin настолько пришелся по душе сообществу программистов, что Google признал его официальным языком разработки под Android, а в последнее время Kotlin начал набирать популярность и в энтерпрайз-проектах. В данной статье я хотел бы привести несколько сравнительных примеров кода, написанного на Kotlin и на Java, и сделать некоторые выводы. Поехали! Начнем по традиции с "Hello World"
// Java
public class Application {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
// Kotlin
class Application
fun main(vararg args: String) {
    println("Hello World!")
}
Глядя на пример Kotlin, можно сразу отметить следующее:
  • не нужно писать точку с запятой в конце строки;
  • все методы описываются ключевым словом fun;
  • чтобы вывести строку достаточно всего одного слова — println()!
Создание экземпляра
// Java (до 10)
final Application application = new Application();
// Kotlin
val application = Application()
Отличия Kotlin:
  • не требуется объявлять тип переменной, если он понятен по экземпляру;
  • вместо типа переменной — val (неизменяемая) или var (изменяемая);
  • для создания экземпляра не нужно писать ключевое слово new!
Описание методов
// Java
public int sum(int a, int b) {
    return (a + b);
}
// Kotlin
fun sum(a: Int, b: Int): Int {
return (a + b)
}
Отличия Kotlin:
  • если из метода нужно что-то вернуть, в сигнатуру добавляется ": Int", где Int — возвращаемый тип;
  • описание параметров метода: сначала имя переменной, затем тип;
  • так как тело метода состоит всего из одной строки, можно опустить return:
    fun sum(a: Int, b: Int): Int = (a+b)
Форматированный вывод строк
// Java
public int sum(int a, int b) {
    int result = (a + b);
    System.out.printf("Сумма %d и %d равна %d\n", a, b, result);
    return result;
}
// Kotlin
fun sum(a: Int, b: Int): Int {
    val result = (a + b)
    println("Сумма $a и $b равна $result")
    return result
}
Kotlin поддерживает интерполяцию строк, достаточно использовать символ "$" вначале переменной. Такая запись значительно повышает чистоту и читабельность кода. Сравнение экземпляров
// Java
object1.equals(object2)
// Kotlin
object1 == object2
В Kotlin сравнение "==" для объектных типов транслируется в equals! А для сравнения ссылок используется "===". Исключения
// Java
public List<String> getFileContent(String file) throws IOException {
    Path path = Paths.get(file);
    return Files.readAllLines(path);
}
// Kotlin
fun getFileContent(file: String): List<String> {
    val path = Paths.get(file)
    return Files.readAllLines(path)
}
В Kotlin нет checked-исключений, теперь не нужно бесконечно прокидывать исключение через всё приложение или городить многоуровневые try-catch. Null Safety
// Java
public class Data {
    String value;

    String render() {
        if (value == null) {
            return "Value: undefined";
        } else {
            return "Value:" + value.toUpperCase();
        }
    }
}
// Kotlin
class Data {
    var value: String? = null
    fun render(): String =
            "Value: ${value?.toUpperCase() ?: "undefined"}"
}
В Kotlin озаботились проблемой NPE и ввели ряд требований:
  • все поля класса и переменные обязательно должны быть проинициализированы;
  • в поле или переменную можно записать "null", но тогда ты обязан явно сказать, что твоя переменная Nullable (написать знак "?");
  • элвис-оператор "?:" работает следующим образом: если слева Null, возьми то, что указано справа. В случае с нашим примером, когда переменная value не проинициализирована, возьмется значение "undefined".
Поля класса и доступ к ним
// Java
public class Data {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}
class App {
    void execute() {
           Data data = new Data()
           data.setValue("Foo")
     }
}
// Kotlin
class Data {
    var value: String = ""
}
class App {
    fun execute() {
          val data = Data()
          data.value = "Foo" // Под капотом выполнится data.set("Foo")
     }
}
В Kotlin достаточно просто описать поле и всё: у него уже есть неявные геттеры и сеттеры (привет lombok), которые при желании в любой момент можно переопределить. При этом читаем и модифицируем значение поля просто обращаясь непосредственно к нему, а под капотом вызывается get()|set(). Циклы
// Java
void example() {
    for(int i = 1; i <= 10; i++) {
        System.out.println(i);
    }

    for(String line : "a,b,c".split(",")) {
        System.out.println(line);
    }
}
// Kotlin
fun example() {
    for(i in 1..10) {
        println(i)
    }

    for(line in "a,b,c".split(",")) {
        println(line)
    }
}
Kotlin предоставил удобный и единообразный синтаксис обхода последовательностей: ты просто используешь слева переменную, справа последовательность, а между ними — ключевое слово "in", тип определяется автоматически по содержимому. Синглтон
// Java
public class Singleton {
    private static Singleton ourInstance = new Singleton();

    public static Singleton getInstance() {
        return ourInstance;
    }

    private Singleton() {
    }
}
class App {
    void execute() {
         Singleton singleton = Singleton.getInstance()
    }
}
// Kotlin
object Singleton {}

class App {
    fun execute() {
          val singleton = Singleton
    }
}
Знакомый всем паттерн "одиночка" достаточно часто используется на практике, поэтому в Kotlin решили создать отдельное ключевое слово "object", которое пишется вместо "class" и означает, что класс является синглтоном, при использовании даже не нужно звать конструктор или какие-либо другие методы! Именованные параметры методов и дефолтные значения
// Java
void setStatus(String code) {
    setStatus(code, "");
}

void setStatus(String code, String desc) {
    this.code = code;
    this.desc = desc;
}
// Kotlin
fun setStatus(code: String, desc: String = "") {
    this.code = code;
    this.desc = desc;
}

fun execute() {
    setStatus("200")
    setStatus(code = "200", desc = "Ok")
}
Случается такое, что не все параметры в методе или конструкторе должны быть обязательными, и в Java мы привыкли создавать набор методов или конструкторов под всевозможную комбинацию параметров. В Kotlin ввели дефолтные параметры, что позволяет объявить 1 метод и передавать в него необходимый набор параметров по ситуации. Стримы
// Java
String getFirst(List<String> strings, String alpha) {
    return strings.stream()
            .filter(x -> x.startsWith(alpha))
            .findFirst()
            .orElse("");
}
// Kotlin
fun getFirst(strings: List<String>, alpha: String): String {
    return strings.first { it.startsWith(alpha) }
}
Появившиеся stream в Java 8 стали неотъемлемым функционалом при работе с коллекциями. В Kotlin стримы сделали еще более удобными и функциональными: у каждой коллекции уже есть набор удобных частоиспользуемых методов для работы с данными. Кроме того, обрати внимание на лямбда выражение внутри метода first: если функциональный литерал имеет ровно один параметр, его объявление можно удалить (вместе с ->), и обращаться к нему по имени it. Пора бы закругляться... Я продемонстрировал лишь малую, базовую часть функционала, но, я уверен, тебе уже захотелось попробовать Kotlin! По своему опыту я могу сделать следующие выводы:
  • Java разработчику очень легко освоить синтаксис Kotlin и начать писать код;
  • у Kotlin полная совместимость с Java, и его уже можно пробовать в своих действующих проектах, например, в тестах;
  • код на Kotlin чище и читабельнее, не нужно писать кучу бойлерплэйта;
  • в IDEA есть автоматический конвертер Java в Kotlin, вы можете брать готовый Java-код и автоматически конвертировать его в Kotlin;
  • новый проект нужно писать на Kotlin, так как с инфраструктурной точки зрения — это та же Java, а по использованию — лучше и удобнее!
Если статья понравилась и вообще уместна на ресурсе о Java, могу продолжить писать об опыте использования Kotlin в реальном энтерпрайзном проекте. Полезные ссылки:
Комментарии (31)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
alex perov
Уровень 1
15 ноября 2023, 17:09
Забыли сказать что Котел еще мультиплатформенный язык для написания приложений как под АйОС линукс ,винда и Андройд,так же он отлично работает в паре с ДЖС, конечно новые приложения писать будет удобней на нем, но ни кто не будет переписывать 100 к строчек Легаси кода, потому что он выглядит лаконично
Nordis
Уровень 28
Expert
2 мая 2022, 21:39
Спасибо за статью. Весьма полезно особенно как памятка. Можно занести в заклатки.
hidden #2641196
Уровень 51
3 сентября 2021, 21:06
Вот здесь можно поучить KOTLIN с нуля (требуется знание английского языка на хорошем уровне) : https://hyperskill.org
alex perov
Уровень 1
15 ноября 2023, 17:07
10 задач в день или плати 50 баксов в месяц)
Матвей
Уровень 28
28 июня 2021, 09:41
В некоторых моментах выглядит привлекательно, и с общей тенденцией упрощения всего процесса он идет в ногу это и плюс и минус одновременно. Однако как по мне жаба все таки более понятна в чтении и лучше в плане первоочередного освоения тк более структурирована и детализирована что ли. Очень многое у котлина как и у пайтона скрыто внутри. А ведь жаба считается одним из лучших в плане понимания ООП как раз благодаря своей детализированости некоторых моментов. Грубо говоря есть System.out.println() а у котлина просто println(). Когда ты пишеш первый вариант ты понимаешь что есть класс System у которого есть поле out у которого есть метод println(). Ты просто понимаешь что в чем находится смотря на код. В то время как котлин скрывает это. И в таких деталях и кроется различие и как по мне начинать изучение как раз лучше с первого варианта для более глубокого понимания. Но тут уже другой вопрос а действительно ли в будущем нужно будет обычному програмисту это понимание?
Vanya
Уровень 1
4 июня 2020, 08:07
так как тело метода состоит всего из одной строки, можно опустить return:
fun sum(a: Int, b: Int): Int = (a+b)
и даже еще короче
fun sum(a: Int, b: Int) = a+b
Denis Burtsev
Уровень 16
15 апреля 2020, 17:12
Как мне кажется, было бы здорово добавить ссылку на этот ресурс: https://hyperskill.org/ Это официальная академия от Jetbrains и там весьма неплохие уроки по Kotlin.
Turbasa Bashil
Уровень 0
1 октября 2019, 16:23
Примеры с Kotlin очень похожи на PHP-7.
Andrei Lead Software Developer (
21 октября 2019, 17:35
Примеры с Котлин похожи на: .Net, TypeScritp, JavaScript, Python и меньше всего на Java
Илья
Уровень 17
8 мая 2019, 19:11
"В Kotlin нет checked-исключений, теперь не нужно бесконечно прокидывать исключение через всё приложение или городить многоуровневые try-catch." Это ведь плохо, нет? Или есть что-то вместо них? checked-исключения в java удобные, ты можешь описать план Б при возникновении ошибки, а что в котлине, приложение просто упадёт и всё?)
Sergey Simonov Java Developer в МТС Умный дом
7 апреля 2019, 07:05
Очень соблазнительно ! И да, Автор, было бы интересно почитать про Ваш опыт использования Котлин в энтерпрайз проекте
Red Lord
Уровень 0
27 января 2019, 04:28
В Котлине нет ни паттерн матчинга, ни карринга, ни кортежей, ни трейтов. После Scala он смотрится откровенно убого, это фактически та же самая Java с другим синтаксисом, примерно как VisualBasic.NET - это другой синтаксис C#. Впрочем, контингенту данного сайта, т.е. не программистам, а вайтишникам и бывшим пиццевозам, такое зайдет. Как отлично выразился в свое время Виталий Светославович Луговский: "Я осознаю, что существуют безмозглые пидopы, у которых в список значимых критериев может входить, к примеру, синтаксис языка. Hу так накласть мне на них. Меня интересуют объективные критерии, а не цацки всякие"
deadbiker
Уровень 1
25 апреля 2020, 08:05
Красиво разъ*б*л!
Ivan Kopylov Android Developer в AiweApps
25 мая 2021, 14:10
Кто-нибудь, принесите деду таблетку) Спасибо - потрещал) особенно с упоминания Scala
hidden #2809050
Уровень 42
1 ноября 2021, 15:08
Надеюсь таких староверов сейчас (в 2021 году) отсеивают на входе. Прогресс не стоит на месте.
alex perov
Уровень 1
15 ноября 2023, 17:14
Сидел на фортране тогда