Использование записей Java в Kotlin
Записи — это классы в Java для хранения неизменяемых данных. Записи содержат фиксированный набор значений — компоненты записи. Они имеют компактный синтаксис в Java и избавляют вас от необходимости писать шаблонный код:
// Java
public record Person (String name, int age) {}
Компилятор автоматически генерирует конечный класс, унаследованный от java.lang.Record со следующими членами:
приватное конечное поле для каждого компонента записи
публичный конструктор с параметрами для всех полей
набор методов для реализации структурного равенства:
equals(),hashCode(),toString()публичный метод для чтения каждого компонента записи
Записи очень похожи на классы данных в Kotlin.
Использование записей Java из кода Kotlin
Вы можете использовать классы записей с компонентами, объявленными на Java, точно так же, как вы используете классы со свойствами в Kotlin. Для доступа к компоненту записи просто используйте его имя, как вы делаете для свойств Kotlin:
val newPerson = Person("Kotlin", 10)
val firstName = newPerson.name
Объявление записей в Kotlin
Kotlin поддерживает объявление записей только для классов данных, и класс данных должен соответствовать требованиям.
Чтобы объявить класс записи в Kotlin, используйте аннотацию @JvmRecord.
@JvmRecord data class Person(val name: String, val age: Int)
Эта JVM-специфическая аннотация позволяет генерировать:
компоненты записи, соответствующие свойствам класса в файле класса
методы доступа к свойствам, именованные в соответствии с соглашением об именовании Java-записей
Класс данных предоставляет equals(), hashCode(), и toString() реализации методов.
Требования
Чтобы объявить класс данных с аннотацией @JvmRecord, он должен соответствовать следующим требованиям:
Класс должен находиться в модуле, нацеленном на байт-код JVM 16 (или 15, если включен параметр компилятора
-Xjvm-enable-preview)Класс не может явно унаследовать никакой другой класс (включая
Any) потому что все JVM-записи неявно наследуются отjava.lang.Record. Однако класс может реализовывать интерфейсы.Класс не может объявлять никаких свойств с вспомогательными полями — за исключением тех, которые инициализируются из соответствующих параметров первичного конструктора.
Класс не может объявлять никаких изменяемых свойств с вспомогательными полями.
Класс не может быть локальным.
Первичный конструктор класса должен быть столь же видимым, как и сам класс.
Включение JVM-записей
Для JVM-записей требуется версия целевого байт-кода 16 или выше.
Чтобы явно указать ее, используйте параметр компилятора jvmTarget в Gradle или Maven.
Дополнительные обсуждения
Подробные технические детали и обсуждение см. в этом предложении языка для JVM-записей.
© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/jvm-records.html