Создание неизменяемых объектов

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

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

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

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

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

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

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

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

2 ответа

Решение

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

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

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

Другие вопросы по тегам