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