Класс Record
public abstract class Record extends Object
Дополнительную информацию о записях, включая описания неявно объявляемых методов, создаваемых компилятором, см. в разделе 8.10 Спецификации языка Java.
Класс-запись — это поверхностно неизменяемый прозрачный носитель фиксированного набора значений, называемых компонентами записи. Язык Java предоставляет лаконичный синтаксис для объявления классов-записей, в котором компоненты записи объявляются в заголовке записи. Список компонентов записи, объявленных в заголовке, образует дескриптор записи.
Класс-запись должен иметь следующие члены: канонический конструктор, который должен иметь как минимум такой же уровень доступа, как и класс-запись, и дескриптор которого совпадает с дескриптором записи; закрытое поле final для каждого компонента, имя и тип которого совпадают с именем и типом компонента; открытый метод доступа для каждого компонента, имя и тип возвращаемого значения которого совпадают с именем и типом компонента. Если эти члены явно не объявлены в теле записи, предоставляются их неявные реализации.
Неявное объявление канонического конструктора имеет такой же уровень доступа, как и класс-запись, и инициализирует поля компонентов соответствующими аргументами конструктора. Неявное объявление методов доступа возвращает значение соответствующего поля компонента. Неявные объявления методов Object.equals(Object), Object.hashCode() и Object.toString() формируются на основе всех полей компонентов.
Основные причины явно объявить канонический конструктор или методы доступа — проверка аргументов конструктора, создание защитных копий изменяемых компонентов или нормализация групп компонентов (например, сокращение рационального числа до несократимого вида).
Для всех классов-записей должно выполняться следующее условие: если компоненты записи R — c1, c2, ... cn, то при копировании экземпляра записи следующим образом:
R copy = new R(r.c1(), r.c2(), ..., r.cn());
тогда должно выполняться r.equals(copy).- Примечание к API:
- Класс-запись, который
implementsSerializable, называется сериализуемой записью. Сериализуемые записи сериализуются и десериализуются иначе, чем обычные сериализуемые объекты. При десериализации вызывается канонический конструктор записи для создания объекта-записи. Некоторые методы, связанные с сериализацией, например readObject и writeObject, игнорируются для сериализуемых записей. Дополнительную информацию о сериализуемых записях см. в разделе 1.13 Спецификации сериализации объектов Java, «Сериализация записей»., Структуру класса-записи можно получить во время выполнения с помощью рефлексии. Дополнительные сведения см. в описании методовClass.isRecord()иClass.getRecordComponents(). - См. Спецификацию языка Java:
- 8.10 Классы-записи
- Начиная с версии:
- 16
- Внешние спецификации
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Конструктор для вызова из классов-записей. |
Краткое описание методов
Методы, объявленные в классе Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создает и возвращает копию этого объекта. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API подлежит удалению в будущей версии. Финализация устарела и подлежит удалению в одном из следующих выпусков. |
final Class |
getClass() |
Возвращает класс этого Object во время выполнения. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно вследствие уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно вследствие уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно вследствие уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
Подробное описание конструкторов
Record
protected Record()
Подробное описание методов
equals
public abstract boolean equals(Object obj)
Object.equals, классы-записи должны также соблюдать условие, согласно которому при «копировании» экземпляра записи путем передачи результатов вызова методов доступа к компонентам записи в канонический конструктор, как показано ниже:
R copy = new R(r.c1(), r.c2(), ..., r.cn());
должно выполняться r.equals(copy).- Переопределяет:
-
equalsв классеObject - Требования к реализации:
- Неявно предоставленная реализация возвращает
trueтогда и только тогда, когда аргумент является экземпляром того же класса-записи, что и эта запись, и каждый компонент этой записи равен соответствующему компоненту аргумента; в противном случае возвращаетсяfalse. Равенство компонентаcопределяется следующим образом:- Если компонент имеет ссылочный тип, он считается равным тогда и только тогда, когда
Objects.equals(this.c, r.c)возвращаетtrue. - Если компонент имеет примитивный тип, то при использовании соответствующего класса-оболочки примитива
PW(классом-оболочкой дляintявляетсяjava.lang.Integerи так далее) компонент считается равным тогда и только тогда, когдаPW.compare(this.c, r.c)возвращает0.
Помимо описанной выше семантики, точный алгоритм, используемый в неявно предоставленной реализации, не специфицирован и может изменяться. Реализация может использовать или не использовать вызовы перечисленных методов, а также может выполнять сравнения как в порядке объявления компонентов, так и в другом порядке.
- Если компонент имеет ссылочный тип, он считается равным тогда и только тогда, когда
- Параметры:
-
obj— объект-ссылка, с которым выполняется сравнение. - Возвращает:
-
true, если эта запись равна аргументу; в противном случае —false. - См. также:
hashCode
public abstract int hashCode()
Object.hashCode. Для записей поведение хеширования ограничено уточненным контрактом метода Record.equals, поэтому любые две записи, созданные из одних и тех же компонентов, должны иметь одинаковый хеш-код.- Переопределяет:
-
hashCodeв классеObject - Требования к реализации:
- Неявно предоставленная реализация возвращает хеш-код, вычисленный путем объединения соответствующих хеш-кодов каждого компонента. Точный алгоритм, используемый в неявно предоставленной реализации, не специфицирован и может изменяться в указанных выше пределах. Полученное целое число не обязано оставаться неизменным между разными запусками приложения, даже если хеш-коды значений компонентов при этом остаются неизменными. Кроме того, биты компонента примитивного типа могут вносить вклад в хеш-код иначе, чем
hashCodeего класса-оболочки примитива. - Возвращает:
- хеш-код этой записи.
- См. также:
toString
public abstract String toString()
Object.toString(), метод toString возвращает строку, которая «текстуально представляет» эту запись. Результат должен быть лаконичным, но информативным представлением, удобным для чтения. Помимо этого общего контракта, классы-записи должны также соблюдать условие, согласно которому любые две равные записи должны возвращать одинаковые строки. Это условие неизбежно ослабляется в редком случае, когда соответствующие равные значения компонентов сами могут иметь разные строковые представления.
- Переопределяет:
-
toStringв классеObject - Требования к реализации:
- Неявно предоставленная реализация возвращает строку, содержащую имя класса-записи, имена компонентов записи и строковые представления значений компонентов, чтобы соответствовать контракту этого метода. Точный формат, создаваемый этой неявно предоставленной реализацией, может изменяться, поэтому приложениям не следует анализировать текущий синтаксис для извлечения значений компонентов записи.
- Возвращает:
- строковое представление объекта.
- См. также:
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.