Я использую Kotlin в последние несколько месяцев, и я очень доволен этим! Для людей, которые этого не знают, это язык, созданный JetBrains (компанией, стоящей за IntelliJ, следовательно, Android Studio), который компилируется в тот же байт-код Java JVM.
Это очень современный и приятный язык, который можно использовать вместе с файлами Java, поэтому не требует преобразования всего проекта.
В этом сообщении в блоге я покажу вам, как писать на Kotlin то, что вы обычно пишете в проекте Android/Java, и почему писать код с помощью Kotlin быстрее и приятнее:=).
Давайте начнем со стандартного определения класса в Java:
public abstract class Car { private String name; Car(String name){ this.name = name; } } public class Ford extends Car{ private String model; private String color; Ford(String model, String color){ super("Ford"); this.model = model; this.color = color; } } Ford focus = new Ford("Focus", "blue")
Довольно стандартные классы Java, у нас есть базовый абстрактный класс под названием “Автомобиль” и соответствующий класс “Форд”, который расширяет Car. В Котлине такой же код был бы:
abstract class Car(val name: String) class Ford(val model: String, val color: String) : Car("Ford") val focus = Ford("Focus", "Blue")
Таким образом, 15 строк кода java – это всего лишь 3! В Kotlin вы определяете конструкторы, встроенные в определение класса, и у вас есть бесплатные геттеры и сеттеры, основанные на видимости полей (подробнее об этом позже). Ключевое слово “extends” в Java заменяется просто “:”, и вы также можете встроить конструктор абстрактного класса (в данном случае: Автомобиль (“Форд”)).
Ford focus = new Ford("Focus", "blue") focus.getName() -> java way val focus = Ford("Focus", "Blue") focus.name -> kotlin way
Конструкторы, а также методы поддерживают значения по умолчанию, чего не может сделать Java:
class Ford(val model: String, val color: String = "Blue") : Car("Ford") val focus = Ford("Focus") println(focus.color) -> prints Blue
Также возможно иметь именованное поле при создании объекта, что, на мой взгляд, решает одну из главных проблем Java: понять значение полей, используемых для создания нового объекта. Итак, давайте представим класс Book на Java с одним параметром в виде строки:
Book book = new Book("George")
Что такое “Джордж? является ли автор? название книги? владелец книги? В Котлине вы можете сделать это:
Book book = new Book("George") -> Java val book = Book("George") -> Kotlin like Java val book = Book(author="George") -> more expressive way
Определенно лучше!
В Kotlin вы можете добавить ключевое слово “данные” в начале класса, если вы это сделаете, компилятор добавит эти методы “бесплатно”.:
равно()
Хэш-код()
пара,toString()
формы,)”,компонент()
копировать()
Таким образом, всего с одним ключевым словом вы получаете много кода бесплатно! Я хочу показать вам, что означает component()
функции, потому что это то, что вы не можете сделать в Java. Идея состоит в том, что вы можете уничтожить объявление вашего класса:
val focus = Ford("Focus", "Blue") val (model, color) = focus println("$model and $color") -> this will print: "Focus and Blue"
Также метод копирования очень полезен для создания другого объекта из предыдущего:
val focus = Ford("Focus", "Blue") val yellowFocus = focus.copy(color = "Yellow")
В Котлине недвижимость может быть var или val. Вы можете думать о val как о конечном поле в Java (поэтому его нельзя изменить), а var – изменяемое свойство, которое не может быть нулевым, если вы хотите иметь изменяемое обнуляемое свойство, которое вам нужно определить с помощью “? выражение:
var mutable = "mutable" val immutable = "immutable" mutable = "changed" -> 'it compiles' immutable = "changed" -> 'doesn't compile' var mutableCanBeNull: String? = null -> 'can be null'
Вы можете безопасно получить доступ к свойству, которое может быть нулевым, с помощью ключевого слова ‘?’:
var mutable = "mutable" println(mutable.legnth) -> 'print 7' var mutableCanBeNull: String? = null println(mutableCanBeNull?.length) -> 'does not crash! print null'
В Android большую часть времени вам нужно ждать обратных вызовов из фреймворка для создания объектов, что означает, что они должны быть определены как нулевые, пока фреймворк не будет готов, а затем каждый раз, когда вы используете эти объекты, вам нужно проверять, не равно ли оно нулю.
Kotlin решает эту проблему с помощью ключевого слова late init для свойств var:
lateinit var name: String -> 'without lateinit it does not compile' name = "Tom" println(name.length)
Пожалуйста, обратите внимание, что вам не нужно указывать “имя?” но просто “имя”, потому что ключевое слово late init сообщает компилятору, что вы собираетесь заполнить свойство перед его использованием!
На этом пока все! В следующем посте я расскажу об определениях функций, типах возвращаемых данных, обратном вызове и статических полях.
Оригинал: “https://dev.to/dbottillo/kotlin-by-examples-class-and-properties”