Non dichiarare interfacce per oggetti immutabili
[EDIT] Dove gli oggetti in questione rappresentano Data Transfer Objects (DTOs) o Plain Old Data (PODs)
È una linea guida ragionevole?
Fino ad ora, ho spesso creato interfacce per classi sigillate che sono immutabili (i dati non possono essere modificati). Ho cercato di stare attento a non usare l'interfaccia ovunque mi interessi l'immutabilità.
Sfortunatamente, l'interfaccia inizia a pervadere il codice (e non è solo il mio codice di cui mi preoccupo). Finisci per essere passato a un'interfaccia e poi vuoi passarlo a qualche codice che vuole davvero presumere che la cosa che gli viene passata sia immutabile.
A causa di questo problema, sto considerando di non dichiarare mai interfacce per oggetti immutabili.
Ciò potrebbe avere ramificazioni rispetto al test unitario, ma a parte questo, sembra una linea guida ragionevole?
O c'è un altro modello che dovrei usare per evitare il problema "spreading-interface" che sto vedendo?
(Sto usando questi oggetti immutabili per diversi motivi: principalmente per la sicurezza dei thread poiché scrivo molto codice multi-thread; ma anche perché significa che posso evitare di fare copie difensive degli oggetti passati ai metodi. Il codice diventa molto più semplice in molti casi in cui sai che qualcosa è immutabile, cosa che non succede se ti è stata data un'interfaccia. In realtà, spesso non puoi nemmeno fare una copia difensiva di un oggetto a cui fa riferimento un'interfaccia se non fornisce un operazione clone o qualsiasi modo di serializzarlo ...)
[MODIFICARE]
Per fornire un contesto molto più ampio per le mie ragioni per voler rendere gli oggetti immutabili, vedi questo post sul blog di Eric Lippert:
http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/
Dovrei anche sottolineare che sto lavorando con alcuni concetti di livello inferiore qui, come elementi che vengono manipolati / passati in code di lavoro multi-thread. Questi sono essenzialmente DTO.
Anche Joshua Bloch raccomanda l'uso di oggetti immutabili nel suo libro Effective Java .
Azione supplementare
Grazie per il feedback, tutto. Ho deciso di andare avanti e utilizzare questa linea guida per i DTO e il loro genere. Finora funziona bene, ma è passata solo una settimana ... Comunque, sta bene.
Ci sono alcune altre questioni relative a questo che vorrei chiedere; in particolare qualcosa che sto chiamando "Immutabilità profonda o superficiale" (nomenclatura che ho rubato dalla clonazione profonda e superficiale) - ma questa è una domanda per un'altra volta.
List<Number>
che può contenere Integer
, Float
, Long
, BigDecimal
, ecc ... Tutto ciò sono immutabili se stessi.