Образец Строителя и Постоянство - PullRequest
8 голосов
/ 22 февраля 2012

Я использую шаблон Builder для нескольких классов моего проекта (несколько аргументов, некоторые обязательные, некоторые необязательные и т. Д.).Эти классы являются неизменяемыми (нет сеттеров, глубокое копирование для геттеров коллекций).

Сейчас я пытаюсь сохранить эти объекты в базе данных, используя постоянную среду, которая создает объекты с конструктором + сеттерами по умолчанию.Мне не очень нравятся мои Строители!

Я не хочу понижать эту настройку до POJO и терять преимущества текущего дизайна (гибкость, неизменность, безопасность конструкции).

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

One post *На самом деле 1010 * указывает на это как особый недостаток шаблона Builder.

РЕДАКТИРОВАТЬ

Один ответ предлагает использовать закрытый конструктор / установщики, но этоработает только если поля класса не являются окончательными, что не в моем случае.

ФИНАЛЬНОЕ РЕДАКТИРОВАНИЕ

Спасибо всем.
То, что я думаю, будетмое окончательное решение выглядит так и работает нормально (для записи я использую MongoDB + Morphia):

class AClass {
    private final String aField;
    private final AClass() {
        aField = "";
    }
    //Standard builder pattern after that - no setters (private or public)
}

1 Ответ

6 голосов
/ 22 февраля 2012

Как я уже сказал в своем комментарии: вы можете включить конструктор по умолчанию и все необходимые установщики, но сделайте их приватными.Таким образом, вы сохраняете неизменность ваших объектов, но ORM, такой как Hibernate, сможет получить доступ к методам / конструктору, когда это необходимо.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...