Не объявляйте интерфейсы для неизменяемых объектов
[РЕДАКТИРОВАТЬ] Где рассматриваемые объекты представляют объекты передачи данных (DTO) или простые старые данные (POD)
Это разумное руководство?
До сих пор я часто создавал интерфейсы для закрытых классов, которые являются неизменяемыми (данные не могут быть изменены). Я старался быть осторожным, чтобы не использовать интерфейс везде, где мне небезразлична неизменность.
К сожалению, интерфейс начинает проникать в код (и я беспокоюсь не только о моем коде). Вы в конечном итоге получаете интерфейс, а затем хотите передать его некоторому коду, который действительно хочет предположить, что передаваемая ему вещь неизменна.
Из-за этой проблемы я рассматриваю возможность никогда не объявлять интерфейсы для неизменяемых объектов.
Это может иметь последствия в отношении модульного тестирования, но кроме этого, кажется ли это разумным руководством?
Или есть другой шаблон, который я должен использовать, чтобы избежать проблемы "интерфейса распространения", которую я вижу?
(Я использую эти неизменяемые объекты по нескольким причинам: главным образом для обеспечения безопасности потоков, поскольку я пишу много многопоточного кода; но также потому, что это означает, что я могу избежать создания защитных копий объектов, передаваемых в методы. Код становится намного проще в Во многих случаях вы знаете, что что-то является неизменным, а вы - нет, если вы получили интерфейс. На самом деле, часто вы даже не можете сделать защитную копию объекта, на который ссылается интерфейс, если он не обеспечивает клонирование или любой способ его сериализации ...)
[РЕДАКТИРОВАТЬ]
Чтобы предоставить мне гораздо больше смысла в желании сделать объекты неизменяемыми, посмотрите это сообщение в блоге Эрика Липперта:
http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/
Я также должен отметить, что я работаю с некоторыми концепциями более низкого уровня, такими как элементы, которыми манипулируют / передают в многопоточных очередях заданий. По сути, это DTO.
Также Джошуа Блох рекомендует использовать неизменяемые объекты в своей книге «Эффективная Java» .
Следовать за
Спасибо за отзыв, все. Я решил пойти дальше и использовать это руководство для DTO и им подобных. Пока все работает хорошо, но прошла всего неделя ... Тем не менее, выглядит хорошо.
Есть некоторые другие вопросы, связанные с этим, о которых я хочу спросить; особенно то, что я называю «Глубокая или неглубокая неизменность» (номенклатура, которую я украл из Глубокого и неглубокого клонирования) - но это вопрос в другой раз.
List<Number>
который может содержать Integer
, Float
, Long
, BigDecimal
и т.д. ... Все это неизменны сами.