Spec-Zone.ru › Kotlin 1.7

Использование 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 к существующему классу не является бинарно совместимым изменением. Оно изменяет соглашение об именовании аксессоров свойств класса.

@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.

Дополнительное обсуждение

Посмотрите это предложение по языку для JVM-записей для получения дополнительных технических подробностей и обсуждения.

Последнее изменение: 15 декабря 2021 г.
Смешивание Java и Kotlin в одном проекте — учебник Строки в Java и Kotlin

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API