Если вы разрабатываете программное обеспечение на Java и заинтересованы в изучении Kotlin, вы, вероятно, ознакомились с некоторым кодом Kotlin, особенно если вы знакомы с Android.
Помимо языкового сходства, есть несколько различий, которые кажутся сбивающими с толку, но поверьте мне, они приходят нам на помощь!
Поэтому я воспользуюсь этой статьей, чтобы поделиться некоторыми различиями между Kotlin и Java, сосредоточив внимание на вещах для людей, которые хотят Kotlin, вам интересно? Так что давайте перейдем к делу.
Эта статья представляет собой перевод статьи, написанной на бразильском португальском языке. Вы можете ознакомиться с оригиналом здесь.
Запуск программы только с помощью функции
Когда мы пишем Java-код и запускаем его, мы оказываем первое влияние:
class Main { public static void main(String[] args) { System.out.println("Hello World!"); } }
Даже если ваша программа печатает только сообщение, основной метод очень подробный.
С Kotlin у нас другой подход:
fun main() { println("Hello World!") }
Вот и все, этого кода достаточно, чтобы запустить наш Hello World!
.
Действительное примечание: нам не нужен оператор ;
on final of, он необязателен и не нужен.
Объявление переменной и ее типы
Когда переменные объявляются в Kotlin, мы должны решить, будет ли он изменяемым или нет, будучи var
изменяемым и val
неизменяемый:
var name = "Alex" name = "Alex Felipe" val age = 26 age = 26 // doesn't compile
Это одна из вещей, которые мне нравятся в Kotlin больше всего, потому что усилия по сохранению неизменности в кодовой базе намного меньше, чем подход Java, который использует final
для этого.
Также обратите внимание, что нет необходимости объявлять тип переменной.
” Означает ли это, что переменные динамически типизируются?”
Как и Java, Kotlin имеет статическую типизацию, другими словами, когда переменная получает значение, неявно устанавливается тип, даже если у переменной явно не объявлен тип.
Следовательно, приведенный ниже код не компилируется:
var name = "Alex" name = 10 // doesn't compile
Если вы любите писать явный код, не расстраивайтесь. Kotlin также позволяет объявлять тип переменной:
var name: String = "Alex" name = "Alex Felipe" val age: Int = 26 age = 26 // doesn't compile
Создание объектов
При работе с объектно-ориентированными языками необходимость создания объектов естественна, и в Java для этого нам нужно использовать new
. Но в Kotlin new
даже не является ключевым словом!
” Итак, как нам создать объект Kotlin?”
Рассматривая этот класс Java:
class Person { private String name; private int age; Person(String name, int age) { this.name = name; this.age = age; } }
Мы можем создать объект таким образом, используя Kotlin:
val alex = Person("Alex", 26) val fran = new Person("Fran", 25) // doesn't compile
Это означает, что переменные с именем new
могут быть скомпилированы на Kotlin.
Свойства вместо атрибутов
Помимо различий в создании экземпляра, Kotlin внес некоторые изменения в объявление класса. В этом примере Person
class у нас есть name
и возраст
атрибуты для хранения состояния объекта.
Этот подход слишком распространен в Java и нескольких языках OO. Однако в Kotlin вместо объявления атрибутов мы объявляем свойства!
” Но в чем разница между атрибутом и свойством?”
Основное различие заключается в том, как осуществляется доступ к атрибутам. При работе с атрибутами хорошей практикой является реализация методов доступа в качестве геттеров и сеттеров для чтения или записи:
class Person { private String name; private int age; 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; } }
Таким образом, мы избегаем манипулирования атрибутами непосредственно в классе без возможного фильтра.
Со свойствами это поведение по умолчанию:
class Person { var name: String var age: Int constructor(name: String, age: Int){ this.name = name this.age = age } }
Kotlin имеет более одного конструктора , первичного и вторичного. В этой реализации я использовал вторичный, но первичный является наиболее распространенным.
Другими словами, когда мы получаем доступ к name
или age
из класса Kotlin, на самом деле мы получаем доступ к сеттеру и получателю! Гораздо проще, не так ли?
Кроме того, в Java, если вы попытаетесь получить доступ к свойствам Kotlin, вы увидите только сеттеры и геттеры 😁
Изменение набора и получения свойств
Поначалу это различие может показаться странным, но чтобы быть более понятным, мы можем объявить методы доступа к свойствам:
class Person { var name: String set(value) { field = value println("Setting the name $value") } get() { println("Getting the name $field") return field } var age: Int constructor(name: String, age: Int){ this.name = name this.age = age } }
Запуск примера кода ниже:
val alex = Person("Alex", 26) alex.name = "Alex Felipe" println(alex.name)
Мы получаем следующий результат:
Setting the name Alex Setting the name Alex Felipe Getting the name Alex Felipe Alex Felipe
Обратите внимание, что даже сам класс во время построения объекта также напрямую обращается к установщику свойства!
Еще один момент, на который следует обратить внимание, внутри set
и get
, мы использовали field
для присвоения и получения значения свойства, т.е. field
представляет реальный атрибут и может быть доступен только в области свойств!
Поэтому, если мы не изменим значение field
, значение реального свойства не изменится.
set(value) { println("Setting the name $value") }
Выполняя тот же тест, мы получаем следующий результат:
Setting the name Alex Setting the name Alex Felipe Getting the name null null
Строка шаблона
Еще одна особенность Kotlin – это способ объединения String
.
Обратите внимание, что мы помещаем все содержимое в ""
без использования оператора +
.
Этот метод вызывается как Шаблон Строка
, также известная как интерполяция строк на других языках.
В принципе, через шаблон String
, мы можем встроить код в String
, либо только для чтения значения , либо для выполнения инструкции, возвращающей значение:
println("1 + 2 = ${1 + 2}")
В этом случае нам нужно поместить весь код в {}
и мы получаем следующий результат:
1 + 2 = 3
Это правило необходимо, когда мы также обращаемся к членам объекта:
println("My name is ${alex.name}")
Вывод
Помимо советов, приведенных в этой статье, Kotlin предлагает множество других функций и отличий по сравнению с Java. Большинство из них были созданы для того, чтобы помочь нам писать и читать меньше кода и получать больше результатов!
Понравились ли вам эти советы? Если да, оставьте свой лайк, оставьте комментарий и поделитесь этой статьей 😉
Оригинал: “https://dev.to/alexfelipe/tips-to-migrate-from-java-to-kotlin-59af”