Использование записей Java в Kotlin
Записи — это классы в Java для хранения неизменяемых данных. Записи содержат фиксированный набор значений — компоненты записи. В Java у них лаконичный синтаксис, и с ними не нужно писать шаблонный код:
// Java
public record Person (String name, int age) {}
Компилятор автоматически создает final-класс, унаследованный от java.lang.Record, со следующими членами:
закрытое final-поле для каждого компонента записи
открытый конструктор с параметрами для всех полей
набор методов для реализации структурного равенства:
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 или выше для генерируемого байткода JVM.
Чтобы указать ее явно, используйте параметр компилятора jvmTarget в Gradle или Maven.
Аннотирование компонентов записей в Kotlin
В Java аннотации компонента записи автоматически распространяются на поле хранения, геттер, сеттер и параметр конструктора. Воспроизвести такое поведение в Kotlin можно с помощью all в качестве цели использования.
Например:
@JvmRecord data class Person(val name: String, @all:Positive val age: Int)
При использовании @JvmRecord с @all: Kotlin:
Распространяет аннотацию на свойство, поле хранения, параметр конструктора, геттер и сеттер.
Также применяет аннотацию к компоненту записи, если аннотация поддерживает
RECORD_COMPONENTв Java.
Поддержка аннотациями компонентов записей
Чтобы сделать аннотацию доступной как для свойств Kotlin , так и для компонентов записей Java, добавьте следующие метааннотации в объявление аннотации:
Для Kotlin:
@TargetДля компонентов записей Java:
@java.lang.annotation.Target
Например:
@Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY) @java.lang.annotation.Target(ElementType.CLASS, ElementType.RECORD_COMPONENT) annotation class ExampleClass
Теперь можно применять @ExampleClass к классам и свойствам Kotlin, а также к классам и компонентам записей Java.
Дополнительное обсуждение
Дополнительные технические сведения и обсуждение см. в этом предложении по языку для записей JVM.
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/jvm-records.html