tgoop.com/BookJava/3949
Create:
Last Update:
Last Update:
Когда лучше использовать record
, а когда class
в Java.
Record vs Class в Java ☕️📦
С 2021-го в Java появилась новая зверушка - record
.
Сначала все радовались: "О, меньше кода, equals/hashCode/constructor сами пишутся!" 🎉
А потом пошли странные вопросы в код-ревью:
"А почему у тебя тут record, а не class?"
"record же immutable, а ты тут мутируешь поле через рефлексию, ты что…"
Разберёмся, когда record - подарок, а когда - мина замедленного действия.
Немного теории 📚
record
в Java — это особый вид final-класса с:- Автоматическим конструктором по всем полям.
-
equals
, hashCode
и toString
из коробки.- Неизменяемыми (final) полями.
- Неявным
private final
для каждого компонента.Это всё звучит прекрасно, но у этого есть архитектурные последствия.
Когда
record
- лучший выбор ✅1. DTO / данные без логики
Когда объект нужен просто как "контейнер" для данных, особенно при обмене между сервисами.
public record UserDto(String name, int age) {}
2. Иммутабельные объекты
Нет сеттеров, нет сюрпризов. Многопоточка будет тебе благодарна ❤️.
3. Модели конфигураций
Конфиг парсится один раз — и потом спокойно читается везде.
4. Key-объекты для Map/Set
Так как
equals
и hashCode
генерятся честно и по всем полям - отличная стабильная ключевая структура.Когда
class
лучше 🚫1. Сложная логика внутри
Если объект должен уметь менять своё состояние,
record
тебе мешает: поля final, сеттеров нет.2. Наследование
Record - всегда
final
. Забудь про расширение.3. ORM (например, Hibernate)
Многие ORM любят пустые конструкторы и сеттеры. С
record
они просто не подружатся (даже если будут пытаться через магию).4. Сериализация с изменениями
Если JSON-модель в будущем изменится,
record
будет ломаться при парсинге, потому что конструктор фиксирован.Хитрости и подводные камни ⚠️
- Можно добавлять методы в record.
public record Point(int x, int y) {
public double length() {
return Math.sqrt(x*x + y*y);
}
}
- Поля можно менять через рефлексию (но не надо — это ломает смысл
record
).- Не стоит превращать record в «богатый объект» с кучей логики — это будет запутывать.
Итог 💡
- Берём record, когда нужна простая, иммутабельная структура данных без лишней логики.
- Берём class, когда есть сложное поведение, наследование, интеграция с фреймворками вроде Hibernate.
record
- это не замена class
, а инструмент для конкретных задач.А вот если ты пишешь DTO и у тебя до сих пор class с геттерами/сеттерами, то, возможно, ты застрял в 2010-м 😏.
👉 @BookJava
BY Библиотека Java разработчика
Share with your friend now:
tgoop.com/BookJava/3949