[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-java-11-25-records-chto-eto-i-zachem":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},404,"records-chto-eto-i-zachem",11,"java-11-25","Java 11–25","🆕","Records — что это и зачем?","Record — компактный способ объявления классов-носителей неизменяемых данных (data carriers). Компилятор автоматически генерирует конструктор, accessor-методы, `equals()`, `hashCode()` и `toString()`.\n\n> **Аналогия из жизни:** record — как бланк паспорта: поля фиксированы (имя, дата рождения, номер), нельзя добавить новые, нельзя изменить заполненные. Вы просто указываете, какие данные нужны, а формат генерируется автоматически.\n\n\u003Cdetails>\u003Csummary>Пример: Record vs обычный класс\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Record — одна строка вместо ~50 строк boilerplate\npublic record Point(int x, int y) {}\n\n\u002F\u002F Эквивалентный обычный класс:\npublic final class Point {\n    private final int x;\n    private final int y;\n\n    public Point(int x, int y) {\n        this.x = x;\n        this.y = y;\n    }\n\n    public int x() { return x; }     \u002F\u002F не getX()!\n    public int y() { return y; }\n\n    @Override\n    public boolean equals(Object o) { ... }\n\n    @Override\n    public int hashCode() { ... }\n\n    @Override\n    public String toString() { return \"Point[x=\" + x + \", y=\" + y + \"]\"; }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Использование\n\n```java\nvar p = new Point(10, 20);\nint x = p.x();           \u002F\u002F accessor (не getX!)\nSystem.out.println(p);   \u002F\u002F Point[x=10, y=20]\n\n\u002F\u002F Compact constructor — валидация\npublic record Email(String value) {\n    public Email {   \u002F\u002F compact canonical constructor\n        if (value == null || !value.contains(\"@\")) {\n            throw new IllegalArgumentException(\"Invalid email: \" + value);\n        }\n        value = value.toLowerCase().strip();\n    }\n}\n\n\u002F\u002F Record с дополнительными методами\npublic record Range(int from, int to) {\n    public Range {\n        if (from > to) throw new IllegalArgumentException();\n    }\n    public int length() { return to - from; }\n    public boolean contains(int value) { return value >= from && value \u003C= to; }\n}\n```\n\n### Ограничения Records\n\n| Ограничение | Причина |\n|-------------|---------|\n| Нельзя наследоваться от другого класса | Неявно наследует `java.lang.Record` |\n| Нельзя объявлять instance-поля | Только компоненты записи |\n| Все поля final и private | Неизменяемость по контракту |\n| Record implicitly final | Нельзя наследоваться от record |\n| Нельзя как JPA Entity | Entity требует no-arg constructor и мутабельность |\n\n### Частые ошибки\n\n- Мутабельные поля в Record — `record Data(List\u003CString> items)` — список мутабельный; делайте defensive copy: `this.items = List.copyOf(items)`\n- Record как JPA Entity — нельзя; Record можно как DTO или `@Embeddable`\n- Ожидать `getX()` вместо `x()` — Jackson и другие библиотеки поддерживают record accessors, но legacy-код может ожидать JavaBean-стиль\n\n### Как используется в 2026\n\n- Records — стандарт для DTO, Value Objects, API responses\u002Frequests\n- Широкая поддержка: Jackson, Spring, Hibernate (Embeddable), MapStruct\n- В комбинации с Sealed Interfaces — алгебраические типы данных\n- Record Patterns (Java 21) — деконструкция records в switch\u002Finstanceof\n\n> **На собеседовании:** не забудьте упомянуть compact constructor (валидация без явного присвоения полей), accessor без get-префикса (`x()` вместо `getX()`), и невозможность использования как JPA Entity. Частая ошибка — не знать про defensive copy для мутабельных компонентов.","","junior",[15],"java-modern",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Records — что это и зачем? — Gymterview","Record — компактный способ объявления классов-носителей неизменяемых данных (data carriers). Компилятор автоматически генерирует конструктор, accessor-методы, `","Record — компактный способ объявления классов-носителей неизменяемых данных (data carriers). Компилятор автоматически ге",[15,13],"Record — компактный способ объявления классов-носителей неизменяемых данных (data carriers). Компилятор автоматически генерирует конструктор, accessor-методы, `equals()`, `hashCode()` и `toString()`.",true]