[Java] Билдеры или конструкторы? Рассуждаем вслух
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Всем привет! Хочу порассуждать над целесообразностью использования билдеров для не сложных объектов.
Для упрощения буду использовать аннотации lombok'a:
@Value
@Builder
Недолго погуглив, получаем, что builder — Отделяет конструирование сложного объекта от его представления так, что в результате одного и того же процесса конструирования могут получаться разные представления. Только ли для сложных объектов?
Рассмотрим на простом примере:
@Value
public class Info {
@Nullable String uuid;
@Nullable String email;
@Nullable String phone;
}
Довольно таки простой класс. На деле получаем иммутабельный объект, который инициализируется через конструктор.
Но, как мы видим, все поля nullable, и создание такие объектов будет выглядеть не очень красиво:
final Info info1 = new Info(null, "email@email.com", "79998888888");
final Info info2 = new Info("3d107928-d225-11ea-87d0-0242ac130003", null, null);
final Info info3 = new Info("3d107928-d225-11ea-87d0-0242ac130003 ", "email@email.com", null);
...
Безусловно, есть варианты:
- Объекты, где немного полей разных типов, можно завезти несколько конструкторов. Но это не решает проблему класса выше.
- Использовать setter'ы — субьективно, нагромождает код.
А что с билдером?
@Value
@Builder
public class Info {
@Nullable String uuid;
@Nullable String email;
@Nullable String phone;
}
Мы получаем весьма элегантное построение не сложного объекта:
final Info info1 = Info.builder()
.uuid("3d107928-d225-11ea-87d0-0242ac130003")
.phone("79998888888")
.build();
final Info2 info2 = Info.builder()
.email("email@email.com")
.phone("79998888888")
.build();
...
}
Однако, для использование в проекте jackson'а, необходимо дополнить наш клас, чтобы он успешно десериализовывался:
@Value
@Builder(builderClassName = "InfoBuilder")
@JsonDeserialize(builder = Info.InfoBuilder.class)
public class Info {
@Nullable String uuid;
@Nullable String email;
@Nullable String phone;
@JsonPOJOBuilder(withPrefix = "")
public static class InfoBuilder {
}
}
Получаем свои плюсы и минусы за оба подхода:
builder:
+
1. Код становится лаконичнее.
3. null в параметрах контруктора не бросается в глаза.
2. Меньше шанс перепутать параметры одного типа.
-
1. Создаем лишний объект, который GC в целом благополучно уберет, но забывать об этом не стоит.
2. При необходимости использовать jacson — нагромоздим класс.
конструктор:
+
1. Минимально нагромождает наш класс, никакой воды.
2. Нет создания лишних объектов.
-
1. Весьма часто в конструктор такого объекта будет прилетать null.
2. Есть вероятность ошибится, когда кто-то будет вносить изменения в код.
Итог
Опираясь на свой опыт — склоняюсь к использованию билдеров. Плата за это не высока, а на выходе имеем код, который приятно читать.
И конечно же, пишите тесты, чтобы избежать 2-го отрицательного пункта использования контрукторов.
P.S. Это моя первая статья, буду благодарен конструктивной критике и комментариям.
===========
Источник:
habr.com
===========
Похожие новости:
- [JavaScript] Коротко о this в функциях javascript
- [Java, Алгоритмы] Как получить все возможные комбинации элементов группы массивов
- [Разработка веб-сайтов, JavaScript] Веб-компоненты в реальном мире (часть 2)
- [JavaScript] LINQ на JavaScript для самых маленьких
- [Разработка веб-сайтов, JavaScript, Программирование, Node.JS] Краткое руководство по Node.js для начинающих (SPA, PWA, mobile-first)
- [Java, Delphi] JNI и Delphi. Использование Java методов при помощи JNI
- [Разработка веб-сайтов, JavaScript, Java, VueJS] Знакомство с Vuecket
- [JavaScript, Node.JS, ReactJS, VueJS] Что, черт возьми, такое гидратация и регидратация? (перевод)
- [Разработка веб-сайтов, JavaScript, Программирование] JavaScript: 250+ практических вопроса (список + викторина + бонус)
- [Java] Ах, эти строки
Теги для поиска: #_java, #_java, #_lombok, #_rassuzhdenija (рассуждения), #_java
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 22:37
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Всем привет! Хочу порассуждать над целесообразностью использования билдеров для не сложных объектов. Для упрощения буду использовать аннотации lombok'a: @Value @Builder Недолго погуглив, получаем, что builder — Отделяет конструирование сложного объекта от его представления так, что в результате одного и того же процесса конструирования могут получаться разные представления. Только ли для сложных объектов? Рассмотрим на простом примере: @Value
public class Info { @Nullable String uuid; @Nullable String email; @Nullable String phone; } Довольно таки простой класс. На деле получаем иммутабельный объект, который инициализируется через конструктор. Но, как мы видим, все поля nullable, и создание такие объектов будет выглядеть не очень красиво: final Info info1 = new Info(null, "email@email.com", "79998888888");
final Info info2 = new Info("3d107928-d225-11ea-87d0-0242ac130003", null, null); final Info info3 = new Info("3d107928-d225-11ea-87d0-0242ac130003 ", "email@email.com", null); ... Безусловно, есть варианты:
А что с билдером? @Value
@Builder public class Info { @Nullable String uuid; @Nullable String email; @Nullable String phone; } Мы получаем весьма элегантное построение не сложного объекта: final Info info1 = Info.builder()
.uuid("3d107928-d225-11ea-87d0-0242ac130003") .phone("79998888888") .build(); final Info2 info2 = Info.builder() .email("email@email.com") .phone("79998888888") .build(); ... } Однако, для использование в проекте jackson'а, необходимо дополнить наш клас, чтобы он успешно десериализовывался: @Value
@Builder(builderClassName = "InfoBuilder") @JsonDeserialize(builder = Info.InfoBuilder.class) public class Info { @Nullable String uuid; @Nullable String email; @Nullable String phone; @JsonPOJOBuilder(withPrefix = "") public static class InfoBuilder { } } Получаем свои плюсы и минусы за оба подхода: builder: + 1. Код становится лаконичнее. 3. null в параметрах контруктора не бросается в глаза. 2. Меньше шанс перепутать параметры одного типа. - 1. Создаем лишний объект, который GC в целом благополучно уберет, но забывать об этом не стоит. 2. При необходимости использовать jacson — нагромоздим класс. конструктор: + 1. Минимально нагромождает наш класс, никакой воды. 2. Нет создания лишних объектов. - 1. Весьма часто в конструктор такого объекта будет прилетать null. 2. Есть вероятность ошибится, когда кто-то будет вносить изменения в код. Итог Опираясь на свой опыт — склоняюсь к использованию билдеров. Плата за это не высока, а на выходе имеем код, который приятно читать. И конечно же, пишите тесты, чтобы избежать 2-го отрицательного пункта использования контрукторов. P.S. Это моя первая статья, буду благодарен конструктивной критике и комментариям. =========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 22:37
Часовой пояс: UTC + 5