In breve: se il Cliente si preoccupa dei parametri dopo il fatto, allora dovrebbe creare una copia difensiva profonda della mappa (non solo la mappa, ma anche i valori). Se il Servizio deve modificare la raccolta, deve creare una copia difensiva. Ma possiamo fare di meglio ...
Per passare in sicurezza la Mappa (ma non per passare in sicurezza il suo contenuto), il Cliente non ha bisogno di copiare la mappa, può usare Collections.unmodifiableMap () per creare una vista non modificabile.
Se il Cliente si preoccupa della mappa dopo il fatto, allora probabilmente si preoccupa anche del contenuto della mappa. Il Cliente sa come fare una copia difensiva di tutte le sottoclassi di Oggetto che saranno incluse nella mappa? Se gli oggetti reali in uso sono tipi immutabili, il Cliente non ha bisogno di sapere come fare una copia difensiva di essi, e il passaggio della collezione non modificabile è sufficiente.
Se il Object
s utilizzato è di tipo mutabile, il Cliente deve crearne una copia profonda, o deve inviare copie (o immutabili) di qualunque Servizio abbia a che fare con la mappa. Ad esempio, se il servizio in realtà intende chiamare .toString()
su tutti gli oggetti nella mappa, è possibile che il contratto possa essere modificato in modo che il servizio accetti un Map<String, String>
. Forse Service è un po 'più intelligente e può anche gestire Object
s che potrebbe implementare Collection
, e usa il metodo .toString()
per non-collezioni, ma itera su raccolte e chiama .toString()
su ognuna di quelle. Se questo è il caso, forse il Cliente può contenere la logica per arrivare a quel passo, e il contratto è cambiato in Map<String, List<String>>
; ricorda di passare le viste non modificabili delle collezioni e non le raccolte stesse.
Ove possibile, preferisco passare viste non modificabili o raccolte immutabili (ad esempio, dalla libreria Guava), contenenti oggetti immutabili. Se Service ha effettivamente bisogno di modificare la raccolta dovrebbe fare una copia (perché dovrebbe sapere che gli effetti collaterali sono generalmente indesiderabili), se necessario profonda. Scoprirai di provare se Service produce effetti collaterali, perché genererà un'eccezione quando proverai a modificare la collezione non modificabile / immutabile, nel qual caso il Cliente deve creare una copia mutevole della collezione, passarla e poi mai usalo di nuovo.