← Назад к вопросам

Что такое Data Class?

1.0 Junior🔥 91 комментариев
#ООП#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Data Class

Data Class (также называется record в Java) — это специальный тип класса, предназначенный для хранения и передачи данных без лишней функциональности. С Java 14 были введены Records, которые являются современным способом создания data classes. В Kotlin data classes существуют намного дольше и являются самым стандартным способом хранения данных.

Java Records (Java 14+)

Record — это компактный способ определить immutable data класс с автоматической генерацией:

  • Конструктора
  • Методов доступа (getters)
  • equals() и hashCode()
  • toString()
// Простой record
public record Person(
    String name,
    int age,
    String email
) {}

// Использование
public static void main(String[] args) {
    Person person = new Person("Alice", 30, "alice@example.com");
    
    System.out.println(person.name());      // alice
    System.out.println(person.age());       // 30
    System.out.println(person.toString());  // Person[name=Alice, age=30, email=alice@example.com]
}

Этот record эквивалентен большому количеству кода на Java:

public final class PersonOld {
    private final String name;
    private final int age;
    private final String email;
    
    public PersonOld(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
    
    public String name() { return name; }
    public int age() { return age; }
    public String email() { return email; }
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        PersonOld that = (PersonOld) o;
        return age == that.age &&
               Objects.equals(name, that.name) &&
               Objects.equals(email, that.email);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(name, age, email);
    }
    
    @Override
    public String toString() {
        return "PersonOld[" +
               "name=" + name +
               ", age=" + age +
               ", email=" + email +
               '\'' + '}';
    }
}

Records с методами и валидацией

public record User(
    String username,
    String email,
    int age
) {
    // Compact constructor для валидации
    public User {
        if (username == null || username.isBlank()) {
            throw new IllegalArgumentException("Username не может быть пустым");
        }
        if (!email.contains("@")) {
            throw new IllegalArgumentException("Email некорректен");
        }
        if (age < 0 || age > 150) {
            throw new IllegalArgumentException("Возраст должен быть между 0 и 150");
        }
    }
    
    // Дополнительные методы
    public boolean isAdult() {
        return age >= 18;
    }
    
    public String emailDomain() {
        return email.substring(email.indexOf('@') + 1);
    }
}

// Использование
var user = new User("john_doe", "john@example.com", 25);
System.out.println(user.isAdult());        // true
System.out.println(user.emailDomain());    // example.com

Data Classes в Kotlin

В Kotlin data classes — это встроенный функционал языка, очень похожий на Java Records:

data class Product(
    val id: Long,
    val name: String,
    val price: Double,
    val inStock: Boolean = true
)

// Использование
val product = Product(1, "Laptop", 999.99)
println(product)
// Product(id=1, name=Laptop, price=999.99, inStock=true)

// Автоматически генерируются методы
println(product.copy(price = 899.99))  // copy конструктор
println(product.component1())           // Деструктуризация
println(product.component2())

Сравнение: Record vs Обычный класс

АспектRecordОбычный класс
MutabilityImmutableМожет быть mutable
КодМинимальныйМного boilerplate
equals/hashCodeАвтоматическийНужно писать вручную
toStringАвтоматическийНужно писать вручную
НаследованиеНельзя расширитьМожно наследовать
ПроизводительностьОптимальнаяЗависит от реализации

Использование в Spring приложениях

// DTO (Data Transfer Object) с record
public record CreateUserRequest(
    String username,
    String email,
    String password
) {}

public record UserResponse(
    String id,
    String username,
    String email
) {}

// Spring контроллер
@RestController
@RequestMapping("/api/users")
public class UserController {
    
    @PostMapping
    public ResponseEntity<UserResponse> createUser(@RequestBody CreateUserRequest request) {
        // Работаем с record как с обычным объектом
        String username = request.username();
        // ...
        return ResponseEntity.ok(new UserResponse("1", username, request.email()));
    }
}

Важные особенности Records

// Records всегда final
public record ImmutableData(String value) {}
// Нельзя: public class ExtendedData extends ImmutableData {}

// Компоненты всегда private final
public record Point(double x, double y) {}
// Нельзя: new Point(...).x = 5;

// Можно использовать с generics
public record Container<T>(T value, String description) {}

// Можно реализовывать интерфейсы
public record ComparablePoint(int x, int y) 
    implements Comparable<ComparablePoint> {
    
    @Override
    public int compareTo(ComparablePoint other) {
        return Integer.compare(this.x * this.x + this.y * this.y,
                              other.x * other.x + other.y * other.y);
    }
}

Недостатки Records

  • Нельзя наследовать — все records extends java.lang.Record
  • Всегда immutable — нельзя создать mutable record
  • Нельзя иметь нулевые поля без явного инициализатора
  • Сложнее для ORM фреймворков — Hibernate лучше работает с обычными классами

Когда использовать

Используй Records для:

  • DTOs (Data Transfer Objects)
  • Value objects
  • Immutable данные
  • Простые контейнеры данных

Избегай Records для:

  • JPA entities (лучше обычные классы с @Entity)
  • Сложной бизнес-логики
  • Когда нужна mutability
  • Legacy code, где нужна совместимость

Заключение

Data Classes в Java (Records) и Kotlin предоставляют элегантный способ работать с immutable данными, значительно сокращая boilerplate код. Они идеальны для DTOs, value objects и всех случаев, где нужен простой контейнер для данных без сложной логики. В современных Java приложениях Records становятся стандартом для передачи данных между слоями архитектуры.

Что такое Data Class? | PrepBro