Эффективная Ява. Шаблон Serializable Builder (как добавить общедоступный конструктор без аргументов?)

Я хочу создать класс в стиле Джошуа Блоха, используя шаблон Builder. Но я хочу использовать этот класс как объект DTO и передать его из EJB. Поэтому он должен иметь общедоступный конструктор без аргументов. Как я могу достичь этого стиля java-bean в шаблоне строителя? В эффективном объекте Java есть только один конструктор, который принимает объект Builder в качестве аргумента. Если я добавлю туда общедоступный конструктор без аргументов, то я потеряю преимущество конструктора над шаблоном Java-bean.


person MyTitle    schedule 11.01.2013    source источник
comment
Вероятно, вы захотите сделать построитель компонентом, а ваш окончательный объект будет результатом .build() этого построителя.   -  person fge    schedule 11.01.2013
comment
@fge да, ты прав. Я хочу сделать билдер bean-компонентом (потому что я могу передавать только bean-компоненты из EJB).   -  person MyTitle    schedule 11.01.2013
comment
Для меня проходящие мимо строители — это запах дизайна. Строители должны быть недолговечными артефактами, используемыми для создания объектов, которые вы хотите передавать.   -  person McDowell    schedule 11.01.2013
comment
@McDowell Я хочу использовать конструктор из соображений безопасности. т. е. когда клиент создает объект и передает его методу EJB, этот объект может находиться в несогласованном состоянии. Я хочу, чтобы клиент не создавал объект в несогласованном состоянии. Почему для вас это запах дизайна? Поскольку шаблон построителя увеличивает размер передаваемого объекта (добавление построителя, по крайней мере, имеет копию всех полей класса внутри внутреннего класса)?   -  person MyTitle    schedule 11.01.2013
comment
@MyTitle Может быть, я что-то упускаю, но решение, обсуждаемое в комментариях, похоже, просто переносит проблему с компонента на компоновщика. Бины (без аргументов; геттеры/сеттеры) изменяемы. Построитель может быть передан в недопустимом состоянии, и я не вижу преимущества перед добавлением метода isValid в компонент (или какого-либо другого механизма проверки).   -  person McDowell    schedule 12.01.2013


Ответы (1)


Не уверен, что заставляет вас использовать шаблон строителя здесь, но вот что мой опыт говорит о вашей проблеме.

  1. Вы используете EJB. Итак, я предполагаю, что вы находитесь в режиме распределенного приложения.
  2. Ваш DTO будет использоваться для переноса данных в EJB и из него. Итак, вам следует подумать о том, чтобы сделать ваш этот DTO сериализуемым (теперь имеет смысл иметь конструктор без аргументов).

По-моему, все, что вам нужно, это какой-то преобразователь, который принимает obj1 от некоторого слоя для обработки, а затем возвращает его.

Я бы рекомендовал использовать билдер только в том случае, когда построение вашего объекта представляет собой многоэтапный процесс (например, регистрация пользователя).

person Prateek    schedule 11.01.2013
comment
Спасибо. Можете ли вы дать более подробное объяснение о трансформаторе? - person MyTitle; 11.01.2013
comment
приятель!!! трансформатор — это все, что преобразует objA в objB, например ObjectB b = new ObjectB(); ‹br/› b.setPropert1(obja.getSomeProperty()); - person Prateek; 11.01.2013