Nie deklaruj interfejsów dla obiektów niezmiennych
[EDYCJA] Gdy przedmiotowe obiekty reprezentują obiekty przesyłania danych (DTO) lub zwykłe stare dane (POD)
Czy to rozsądna wskazówka?
Do tej pory często tworzyłem interfejsy dla zapieczętowanych klas, które są niezmienne (danych nie można zmienić). Sam starałem się nie używać interfejsu w żadnym miejscu, w którym zależy mi na niezmienności.
Niestety interfejs zaczyna przenikać do kodu (martwię się nie tylko o mój kod). Skończyło się na tym, że przeszedłeś przez interfejs, a potem chcesz przekazać go do jakiegoś kodu, który naprawdę chce założyć, że przekazywana do niego rzecz jest niezmienna.
Z powodu tego problemu rozważam nigdy nie deklarowanie interfejsów dla niezmiennych obiektów.
Może to mieć konsekwencje w odniesieniu do testów jednostkowych, ale poza tym, czy wydaje się to rozsądną wskazówką?
Czy może jest inny wzór, którego powinienem użyć, aby uniknąć problemu z interfejsem rozprzestrzeniania, który widzę?
(Używam tych niezmiennych obiektów z kilku powodów: Głównie dla bezpieczeństwa wątków, ponieważ piszę dużo wielowątkowego kodu; ale także dlatego, że oznacza to, że mogę uniknąć tworzenia obronnych kopii obiektów przekazywanych do metod. Kod staje się o wiele prostszy w w wielu przypadkach, gdy wiesz, że coś jest niezmienne - czego nie masz, jeśli otrzymałeś interfejs. W rzeczywistości często nie możesz nawet wykonać defensywnej kopii obiektu, do którego odwołuje się interfejs, jeśli nie zapewnia klonowanie lub jakikolwiek sposób szeregowania go ...)
[EDYTOWAĆ]
Aby podać znacznie więcej kontekstu z moich powodów, dla których chcę, aby obiekty były niezmienne, zobacz ten post na blogu autorstwa Erica Lipperta:
http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/
Powinienem również zauważyć, że pracuję tutaj z niektórymi koncepcjami niższego poziomu, takimi jak elementy, które są manipulowane / przekazywane w wielowątkowych kolejkach zadań. Są to zasadniczo DTO.
Również Joshua Bloch zaleca korzystanie z niezmiennych obiektów w swojej książce Effective Java .
Zagryźć
Dzięki za opinie. Postanowiłem pójść dalej i skorzystać z tych wskazówek dla DTO i ich podobnych. Jak dotąd działa dobrze, ale minął tylko tydzień ... Wygląda dobrze.
Jest kilka innych kwestii związanych z tym, o które chcę zapytać; zwłaszcza coś, co nazywam „głęboką lub płytką niezmiennością” (nazewnictwo, które ukradłem z klonowania głębokiego i płytkiego) - ale to pytanie jest na inny czas.
List<Number>
, które może pomieścić Integer
, Float
, Long
, BigDecimal
, itd ... Wszystko to są niezmienne same.