Создание неизменяемых объектов - PullRequest
1 голос
/ 18 февраля 2012

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

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

Я попробовал два варианта:

  • В первом яудостоверился, что в каждом классе реализован «неизменяемый» интерфейс , содержащий только геттеры.И если мне нужно было вернуть объект в пользовательский интерфейс, я вернул его «немодифицируемый» интерфейс.Так что пользовательский интерфейс мог только просматривать геттеры.Проблема в том, что их все еще можно легко привести к исходному объекту и получить доступ.Сначала я думал, что этот уровень безопасности достаточно хорош, но случилось так, что кто-то случайно бросил некоторые объекты и использовал их неправильно, и целостность была нарушена.

  • Во второмя попытался предоставить неизменяемые оболочки для каждого возвращаемого объекта.Но проблема в том, что эти возвращенные объекты можно использовать в качестве параметров для методов в контроллерах, поэтому их необходимо развернуть в контроллерах.Я пытался сделать пакет uwrap() method методу приватным, но затем я должен поместить каждый определенный класс-оболочку в один пакет с контроллерами, и это немного неудобно.

РЕДАКТИРОВАТЬ: 3-й вариант:

  • (Благодаря vic ) В третьем варианте объект оборачивается неизменяемой оболочкой ,но не может быть развернут этой оболочкой.Каждый немодифицируемый связан с его изменяемым объектом в Hashmap.Таким образом, «распаковка» выполняется путем получения модифицируемого объекта, который связан с немодифицируемым объектом.

Кто-нибудь знает или имеет какие-то идеи относительно , как сделать объекты немодифицируемыми, чтобы они могли быть возвращеныконтроллер, и сделать возможным сделать их снова изменяемыми, когда они возвращаются обратно в контроллеры?

Ответы [ 2 ]

2 голосов
/ 18 февраля 2012

Выберите шаблон проектирования State , который является отличным выбором для представления состояния объекта.

По сути, всякий раз, когда пользовательский интерфейс хочет отобразить объект домена, контроллер предоставляет ему неизменный объект DTO, представляющий снимок самого объекта. Это ограничит слой пользовательского интерфейса, чтобы иметь только неизменные снимки ваших доменных объектов. Когда пользовательский интерфейс хочет внести изменения в ваши доменные объекты, он отправляет неизменяемые объекты состояния контроллеру, который использует их для внутреннего изменения соответствующих доменных объектов.

2 голосов
/ 18 февраля 2012

Что, если контроллеры хранят в частном порядке изменяемые версии объектов и возвращают неизменяемые версии их во «внешний мир». Изменяемые версии будут иметь какой-то уникальный идентификатор, и контроллеры смогут unwrap его искать, просматривая какой-то Collection.

...