Как воспроизводится Java класс в Kotlin и есть ли похожий объект
Что проверяют
Понимаете ли вы, что многие конструкции Java в Kotlin выражаются короче, и знаете ли, во что они компилируются.
Как отвечать
Обычный класс переносится почти дословно, но большая часть шаблона исчезает: свойства объявляются в основном конструкторе, геттеры и сеттеры генерируются, equals, hashCode и toString приходят с data class.
public class Person {
private final String name;
public Person(String name) { this.name = name; }
public String getName() { return name; }
}data class Person(val name: String)Соответствия, которые стоит назвать:
- статические члены заменяются
companion object, а чтобы они выглядели статикой из Java, ставится@JvmStatic; - синглтон это
objectвместо приватного конструктора и статического поля; - константы:
const valв объекте-компаньоне превращается в статическое поле; - утилитный класс со статическими методами заменяется функциями верхнего уровня в файле, а из Java они видны как статические методы класса с именем файла (меняется через
@JvmName); - перегрузки конструктора заменяются значениями по умолчанию, а для вызова из Java добавляется
@JvmOverloads; - интерфейсы с одним методом реализуются лямбдой;
- наследование: класс в Kotlin закрыт по умолчанию, его открывают словом
open.
Полезно добавить, что при взаимодействии с Java важны платформенные типы: значения оттуда компилятор не проверяет на null, и ответственность остаётся на разработчике.
Где спотыкаются
Переносят код дословно и оставляют геттеры с сеттерами, из-за чего Kotlin выглядит как многословная Java.
Делают всё data class, включая классы с поведением, где сравнение по полям не нужно и даже вредно.
Забывают про аннотации совместимости, и код перестаёт удобно вызываться из Java.