Se la tua classe è una struttura dati, ovviamente va bene farlo.
Java Map ha un metodo put, che memorizza un riferimento. Se modifichi quel riferimento, ti aspetteresti di riavere l'oggetto modificato quando chiami Map.get ().
Se la tua classe è un'auto, e stai impostando i pneumatici, allora bene, il problema c'è: cosa succede se imposto il pneumatico e poi in un'altra parte del programma lo modifico? In questo caso (quando ci sono effetti collaterali), se il risultato è incoerenza, allora no, il setter non dovrebbe essere lì.
Penso che quello che chiedi sia un po 'ampio, perché ci sono casi in cui dovresti essere cauto e gli altri in cui è perfettamente valido. I setter di quel tipo esistono e sono dappertutto in Java.
Forse una soluzione migliore è passare in una classe che è immutabile (tutti i suoi campi sono definitivi) se vuoi evitare effetti collaterali. Se stavo usando un'API, non mi aspetterei che tutti i setter clonino i miei oggetti!
Esempio:
hai una classe Person
. Può avere un JobPlace
o no. Conosci il lavoro che una persona avrà quando lo creerai? Molto probabilmente no. Inoltre, la persona può cambiare lavoro? Sicuro.
Questo giustifica un person.setJob(job)
. Ora la persona ha un riferimento al suo lavoro, ma cosa succede se il lavoro stesso cambia? Ad esempio, la società potrebbe cambiare nome. Person
ha solo bisogno di conoscere l'interfaccia di JobPlace
per funzionare, quindi il lavoro stesso può cambiare e se diversi Person
hanno lo stesso riferimento a JobPlace
, allora devi cambiarlo solo in un posto.