Зарегистрируйтесь, чтобы продолжить обучение

Data-классы Java: Классы

Для получения данных извне и передачи их куда-то дальше в Java используются Data-классы. Обычно это связано с любыми внешними источниками данных, базой данных, HTTP, файлами. Если нам нужно получить какие-то данные, например информацию о заказе, нам придется создать класс, который описывает этот заказ. Причем сам класс не будет зависеть от того, из какого источника пришли данные. То же самое работает и в обратном направлении, если нам нужно выгрузить данные, то для этого создаются свои классы, которые содержат только необходимые поля.

Data-классы это обычные классы без поведения. Из-за этого их стараются делать неизменяемыми, или как говорят иммутабельными (immutable), для избежания случайных ошибок. В идеале у этих классов нет сеттеров, а все поля помечены как final, что защищает их от изменения.

// DTO - Data Transfer Object
public class OrderDTO {
    private final int id;
    private final String customerName;
    private final double orderAmount;

    // После инициализации финальных полей их больше нельзя менять
    public OrderDTO(int id, String customerName, double orderAmount) {
        this.id = id;
        this.customerName = customerName;
        this.orderAmount = orderAmount;
    }

    public int getId() {
        return id;
    }

    public String getCustomerName() {
        return customerName;
    }

    public double getOrderAmount() {
        return orderAmount;
    }
}

Data-классы это настолько большая часть любого приложения на Java, что в язык была внедрена новая конструкция Record (запись). Записи по своей сути Data-классы. Ниже пример того, как мы бы могли переделать наш OrderDTO:

// Неизменяемые по умолчанию и это не меняется
public record OrderDTO(int id, String customerName, double orderAmount) {
}

Запись значительно сокращает количество кода, предоставляя практически такую же функциональность. Но с небольшими отличиями. Геттеры в записях не содержат префикса get.

public class Main {
    public static void main(String[] args) {
        // Создаем экземпляры заказа
        Order order1 = new OrderDTO(12345, "Alice Smith", 250.0);
        Order order2 = new OrderDTO(67890, "Bob Johnson", 450.5);

        // Получаем доступ к свойствам заказа
        System.out.println("Order 1 Details:");
        System.out.println("Order ID: " + order1.id());
        System.out.println("Customer Name: " + order1.customerName());
        System.out.println("Order Amount: " + order1.orderAmount());

        System.out.println("Order 2 Details:");
        System.out.println("Order ID: " + order2.id());
        System.out.println("Customer Name: " + order2.customerName());
        System.out.println("Order Amount: " + order2.orderAmount());
    }
}

Несмотря на синтаксическое превосходство, записи обладают рядом недостатков, которые делают их использование в качестве замены обычных классов неудобным. Сюда входят:

  • Возможность работать только в неизменяемом стиле. Нет сеттеров.
  • Только один конструктор со всеми полями.
  • Нет наследования (иногда нужно).
  • Многие библиотеки и фреймворки до сих пор не совместимы с записями.

Поэтому основным способом по-прежнему является создание обычных классов. И Lombok делает этот процесс достаточно простым.

@Getter
@AllArgsConstructor
public class OrderDTO {
    private final int id;
    private final String customerName;
    private final double orderAmount;
}

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на Java, Разработка веб-приложений и микросервисов используя Spring Boot, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу