128 читали · 3 года назад
Не самые очевидные советы по написанию DTO на Java
Источник: Nuances of Programming Сегодня приложения зачастую имеют распределенный характер. Для подключения к другим сервисам нужно писать больше кода  —  и при этом стараться сделать его простым. Чтобы воспользоваться данными из внешней службы, мы обычно преобразуем полезную нагрузку JSON в объект передачи данных (Data Transfer Object, DTO). Код, обрабатывающий DTO, быстро усложняется, но с этим могут помочь несколько советов. Вполне возможно писать DTO, с которыми легче взаимодействовать и которые облегчают написание и чтение кода...
🍕 Как упростить работу с DTO в Java: советы для чистого и надёжного кода Современные приложения становятся всё более распределёнными, а это значит, что мы всё чаще взаимодействуем с внешними сервисами. Для обработки данных из этих сервисов мы часто используем DTO — объекты, которые преобразуют JSON в удобный формат. Однако работа с DTO может стать головной болью, если не следовать нескольким простым принципам. 1️⃣ Сделайте DTO неизменяемыми Неизменяемость — это мощный инструмент, который упрощает отладку и делает код более предсказуемым. Если объект нельзя изменить после создания, вы автоматически избавляетесь от множества потенциальных ошибок. Пример неизменяемого DTO: public final class PizzaDto { private final String name; private final List<String> ingredients; public PizzaDto(String name, List<String> ingredients) { this.name = name; this.ingredients = List.copyOf(ingredients); // Защитная копия } public String getName() { return name; } public List<String> getIngredients() { return ingredients; // Возвращаем неизменяемый список } } Почему это важно? - Никто не сможет случайно изменить данные внутри DTO. - Упрощается отладка: если объект неизменяем, проблема может быть только в его создании. - Код становится более безопасным и понятным. 💡 Совет: Начиная с Java 16, можно использовать записи (records) для ещё более лаконичного создания неизменяемых классов: public record PizzaDto(String name, List<String> ingredients) {} 2️⃣ Избегайте null-значений Null-значения — это источник бесконечных NullPointerException. Чтобы избежать этой проблемы, инициализируйте поля пустыми значениями, если входные данные отсутствуют. Пример: public PizzaDto(String name, List<String> ingredients) { this.name = name != null ? name : ""; this.ingredients = ingredients != null ? List.copyOf(ingredients) : List.of(); } Теперь клиентский код может спокойно работать с DTO, не проверяя каждое поле на null. 3️⃣ Используйте конструкторы (Builders) Для сложных DTO ручная инициализация может занимать много строк кода. Чтобы упростить процесс, используйте шаблон Builder. Пример: PizzaDto pizza = new PizzaDtoBuilder() .setName("Реджина") .setIngredients(List.of("сыр", "томаты", "грибы")) .build(); Builder делает код более читаемым и позволяет легко добавлять новые параметры без изменения существующего кода. 💡 Совет: Используйте плагины для IDE (например, IntelliJ IDEA), чтобы автоматически генерировать Builder'ы или Lombok. 4️⃣ Настройте сериализацию с Jackson Jackson — самая популярная библиотека для работы с JSON в Java. Чтобы использовать её с неизменяемыми DTO, добавьте аннотации: public final class PizzaDto { private final String name; private final List<String> ingredients; @JsonCreator public PizzaDto( @JsonProperty("name") String name, @JsonProperty("ingredients") List<String> ingredients) { this.name = name; this.ingredients = List.copyOf(ingredients); } // Геттеры... } Если вы предпочитаете Gson или Moshi, они могут работать с неизменяемыми DTO без дополнительных аннотаций, но будьте осторожны: эти библиотеки используют рефлексию, что может привести к неожиданным результатам. 5️⃣ Почему это работает? Неизменяемые DTO имеют множество преимуществ: - Безопасность: Данные остаются неизменными, что снижает риск ошибок. - Читаемость: Код становится проще для понимания и поддержки. - Отладка: Легче находить ошибки, так как состояние объекта не меняется после создания. Как сказал Джошуа Блох в своей книге "Эффективная Java": «Неизменяемые классы проще в разработке, реализации и использовании, чем изменяемые. Они менее подвержены ошибкам и более безопасны.» 🎯 Заключение Следуя этим простым принципам, вы сможете улучшить качество своего кода: 1. Сделайте DTO неизменяемыми. 2. Избегайте null-значений. 3. Используйте Builder для удобной инициализации. 4. Настройте сериализацию с помощью Jackson. Источник ➡️ Medium Немыкин.Продакшн - Java/Kotlin developer #Java #DTO #Programming