Records

Тема дорожной карты · Java

Java Records — это лаконичный, неизменяемый тип класса для переноса данных, представленный как стандартная функция в Java 16 (в предварительном просмотре в Java 14–15), устраняющий шаблонный код написания конструкторов, аксессоров, equals(), hashCode() и toString() для простых классов, хранящих данные. Объявленный с ключевым словом recordrecord Point(int x, int y) {} — Java Record автоматически генерирует канонический конструктор, методы-аксессоры компонентов (x(), y()) и корректные реализации equals/hashCode/toString на основе всех компонентов записи, полностью удовлетворяя контракту класса, основанного на значении. Java Records неявно являются final, расширяют java.lang.Record, не могут объявлять поля экземпляра за пределами своих компонентов и поддерживают компактные канонические конструкторы для логики валидации, что делает их идеальными для DTO, интерфейсов проекции JPA, ключей Map и неизменяемых доменных объектов-значений. Records органично интегрируются с Pattern Matching — record patterns вроде case Point(int x, int y) в switch-выражениях обеспечивают лаконичную деструктуризацию, — полностью сериализуемы, маппируемы в JSON через Jackson (@JsonAutoDetect) и используемы в качестве тел запросов/ответов Spring MVC с минимальной конфигурацией. Java Records улучшают качество кода, делая неизменяемость по умолчанию и снижая ошибки изменяемого состояния — дополнение к Sealed Classes и Pattern Matching в наборе современных возможностей Java.

Как это работает

Records — это Java 17/21 LTS с фичами, меняющими, как пишется код: records (immutable data), sealed-типы (закрытая иерархия), pattern matching для switch (21+), текстовые блоки, var, switch-выражения, records как pattern-deconstructed типы. Virtual threads (21) драматически упрощают concurrent server-код. Reactive-программирование (Project Reactor, RxJava) ещё актуально, но virtual threads сужают его нишу.

Когда применять

Таргет 21 LTS для новых проектов — одни virtual threads стоят апгрейда. Records — для DTO, sealed-типы — для конечных иерархий, pattern matching — при диспетчеризации по типу. Миграция с reactive (Project Reactor) на virtual threads — где читаемость бьёт async-stream-преимущества. GraalVM native image — когда важны быстрый старт + низкая память (CLI-тулзы, serverless).

Типичные ошибки

Ловушки Records: блокировка на virtual thread внутри synchronized-блока (пиннит carrier — теряет смысл); чрезмерное использование records для mutable-концептов (поля records — final); баги reflection в GraalVM native image (требуют файлы конфигурации); расчёт, что cancellation Reactor идентичен interruption virtual thread (разная семантика).

Связанные понятия

Полезные ресурсы