Non dichiarare interfacce per oggetti immutabili
[EDIT] Dove gli oggetti in questione rappresentano oggetti Data Transfer (DTO) o Plain Old Data (POD)
È 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 preoccupassi dell'immutabilità.
Sfortunatamente, l'interfaccia inizia a pervadere il codice (e non è solo il mio codice che mi preoccupa). Si finisce per passare un'interfaccia, e poi si vuole passare ad un codice che vuole davvero dare per scontato che la cosa che gli viene passata sia immutabile.
A causa di questo problema, sto considerando di non dichiarare mai le interfacce per oggetti immutabili.
Questo potrebbe avere ramificazioni rispetto al Test delle unità, ma a parte questo, sembra una linea guida ragionevole?
O c'è un altro schema che dovrei usare per evitare il problema della "diffusione-interfaccia" che sto vedendo?
(Sto usando questi oggetti immutabili per diversi motivi: Principalmente per la sicurezza dei thread poiché scrivo un sacco di codice multi-thread, ma anche perché significa che posso evitare di fare copie difensive di oggetti passati ai metodi. molto più semplice in molti casi quando sai che qualcosa è immutabile, cosa che non ti succede se ti è stata consegnata un'interfaccia, infatti spesso non puoi nemmeno fare una copia difensiva di un oggetto referenziato tramite un'interfaccia se non lo fa t fornire un'operazione di clonazione o qualsiasi modo di serializzarlo ...)
[EDIT]
Per fornire molto più contesto alle mie ragioni per cui voglio rendere immutabili gli oggetti, consulta questo post di Eric Lippert:
Vorrei anche sottolineare che sto lavorando con alcuni concetti di livello inferiore qui, come gli oggetti che vengono manipolati / passati in code di lavoro multi-thread. Questi sono essenzialmente DTO.
Anche Joshua Bloch consiglia l'uso di oggetti immutabili nel suo libro Effective Java .
Follow-up
Grazie per il feedback, tutto. Ho deciso di andare avanti e utilizzare questa linea guida per i DTO e i loro simili. Funziona bene finora, ma è stata solo una settimana ... Comunque, sta andando bene.
Ci sono altri problemi relativi a questo che voglio chiedere; in particolare qualcosa che sto definendo "Deep o Shallow Immutability" (nomenclatura che ho rubato da Deep e Shallow cloning) - ma questa è una domanda per un'altra volta.