2016-06-18 2 views
-2

Итак, у меня есть класс POJO, назови его: InnerDomainObject. Тогда у меня есть объект, представляющий этот объект, еще с несколькими полями, для общения по отношению к различным клиентам (Он с API DTO): OuterDomainObjectDowncasting в Java? Это проблема с понижением?

Поскольку DTO есть на самом деле все поля Pojos, я сделал OuterDomainObject Наследовать из InnerDomainObject.

Теперь мне нужно как-то сделать InnerDomainObject для OuterDomainObject -> невозможно.

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

Я просто хочу, чтобы OuterDomainObject создавался из значений InnerDomainOBject, а затем добавлял некоторые из них перед отправкой его клиенту.

Каков наилучший способ сделать это?

+0

Один из способов - использовать композицию, а не наследование. –

+0

К сожалению, нет, JB Nizet. Для меня важно добавить дополнительные атрибуты в пределах одного уровня иерархии. Композиция вводит дополнительный уровень иерархии внутри скомпонованного объекта: например: outerDTO.innerDTO.innerattribute и outerDTO.outerattributes - мне нужны все атрибуты flat – noneconnex

+0

В DTO или в JSON (если DTO преобразуется в JSON) ? Если вы хотите наследовать, вам придется копировать. –

ответ

0

Похоже, вы используете Adapter Pattern. Вам не нужно бросать объект InnerDomainObject в OuterDomainObject. Вы должны использовать композицию: OuterDomainObject должен содержать ссылку на объект InnerDomainObject, который, скорее всего, будет передан в конструктор. Когда клиент вызывает метод в OuterDomainObject, если этот метод существует в InnerDomainObject, OuterDomainObject должен вызывать этот метод на своем экземпляре InnerDomainObject. Вместо того, чтобы лить InnerDomainObject foo в OuterDomainObject, просто создайте новый OuterDomainObject и перейдите в foo: new OuterDomainObject(foo). Вам нужно будет написать простой код клея, но результат будет очень чистым.

+0

Mh. Что бы тогда выглядел OuterDomainObject? Например: удерживание объекта innerdomainobject? Будет ли внутридоменный объект атрибутом? – noneconnex

+0

Да, OuterDomainObject будет содержать ссылку на объект InnerDomainObject, который будет установлен в конструкторе OuterDomainObject. –

+0

Ну, Даниэль, это было то, что впервые пришло в голову. Но для «причин» (вся эта «проблема» на самом деле существует только потому, что я m в процессе перехода на унификацию/генерацию всех объектов в API), я хотел, чтобы она была плоской. Поэтому наследование. Во всяком случае, спасибо за ваш ответ - кажется, это невозможно сделать, и мне кажется, мне придется жить с этим до тех пор, пока API не перейдет. – noneconnex

Смежные вопросы