TGViewer
Java: fill the gaps Java: fill the gaps @java_fillthegaps · 12.3K subscribers
Post #168 4.47K
Records: обзор

Записи (records) появились как превью фича в java 14. В этом посте разберём, что такое записи, чем отличаются от классов и как их использовать.

Записи определяют неизменяемый набор значений:
record Point(int x, int y) {}

Создаются так же, как и другие классы:
Point p = new Point(1,2);

В чём особенность?
🔸 Поля нельзя поменять: ни внутри методов, ни через рефлекшн
🔸 Нет приватных полей
🔸 Не участвуют в наследовании
🔸 Конструктор по умолчанию не пустой, а с заданными полями
🔸 Добавлены геттеры по умолчанию:
p.x()
p.y()
🔸 toString по умолчанию
Point[x=1, y=2]
🔸 equals и hashcode по умолчанию
🔸 Для сериализации не нужен serialVersionUID

Запись - специальный класс для хранения данных. record Point компилируется в
public final class Point extends java/lang/Record

Все остальные функции класса сохраняются:
✅ Определять методы
✅ Реализовать интерфейсы
✅ Добавлять static поля и методы
✅ Ставить аннотации
✅ Использовать дженерики

Ещё одна особенность records — конструктор. Конструктор по умолчанию содержит все поля и называется канонический конструктор:
public Point(int x, int y){
this.x=x;
this.y=y;
}

Он доступен по умолчанию, его можно не писать. Переопределяйте конструктор, если нужно добавить проверку аргументов:
public Point(int x, int y){
if (x>100) throw new …
this.x=x;
this.y=y;
}

Для канонического конструктора есть краткая запись. Можно опустить присвоение переменных и оставить только нужные проверки:
public Point {
if (x>100) throw new ...
}

Другие конструкторы должны вызывать канонический:
public Point(int x) {
this(x,0);
}

Где использовать записи:

1️⃣ В многопоточных алгоритмах
Неизменяемые значения не нужно синхронизировать.

2️⃣ Data Transfer Object (DTO)
Для отправки данных пользователю или в другую систему.

record UserDTO(long id, String name) {
public UserDTO(User user) {…}
}

3️⃣ Как промежуточные значения в Stream API
Для упрощения сложного кода и большей читаемости.

4️⃣ Как составное возвращаемое значение
Когда не хочется создавать отдельный класс ради одного метода:
record MinMax<T>(T min, T max) {} 

❗️Правильный ответ на вопрос перед постом:
В записях поля неизменны, также записи не участвуют в наследовании и не содержат приватных полей.
  • 👍 3
More from @java_fillthegaps
  1. Apr 30, 2026Get Your Hands Dirty on Clean Architecture: отзыв на книгу Когда я подняла тему чистой арх…
  2. Apr 27, 2026​Clean Architecture: отзыв на книгу Наконец-то дочитала книгу Clean Architecture Роберта М…
  3. Mar 4, 2026Как переиспользовать контекст в интеграционных тестах Сегодня расскажу базовый минимум для…
  4. Mar 4, 2026Post #660
  5. Mar 4, 2026Тестовый контекст поднимается 2 минуты. У нас 4 класса с интеграционными тестами, их конфи…
  6. Feb 25, 2026Чистая архитектура. Главы 3-5 Продолжаем спидран по Clean Architecture Роберта Мартина. ⭐️…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →