Est-ce une bonne pratique d'avoir une méthode de setter de ce type? Avec des types primitifs, c'est évidemment bien, mais lorsque vous avez un seigur pour un champ qui contient une référence à un objet mutable, cela pourrait se tromper - l'appelant pourrait modifier l'objet après la transmission de la méthode setField
.
class Myclass{
private MyOtherClass field;
public setField(MyOtherClass field){
this.field = field;
}
}
Est-ce la bonne chose à appeler simplement clone()
(en supposant MyOtherClass
n'a que des champs de type primitif)?
public setField(MyOtherClass field) {
this.field = field.clone();
}
Si votre classe est une structure de données, il est évident que cela va bien de le faire. Java carte a une méthode de vente, qui stocke une référence. Si vous modifiez cette référence, vous vous attendez à récupérer l'objet modifié lorsque vous appelez map.get ().
Si votre classe est une voiture et que vous définissez les pneus, le problème est là: que se passe-t-il si je fixais le pneu puis dans une autre partie du programme, je le modifie? Dans ce cas (quand il y a des effets secondaires), si le résultat est incohérent, non plus, le setter ne devrait pas être là.
Je pense que ce que vous demandez est un peu large, car il y a des cas où vous devriez être prudent et d'autres où il est parfaitement valide. Des setters de ce type existent et sont partout à la place en Java.
Peut-être qu'une meilleure solution est de passer dans une classe immuable (tous les champs sont finaux) si vous souhaitez éviter les effets secondaires. Si j'utilisais une API, je ne m'attendais pas à ce que tout ce que c'est des régleurs clonant mes objets!
Exemple :
vous avez une classe Person
. Il peut avoir un JobPlace
ou non. Connaissez-vous le travail qu'une personne va avoir quand vous le créerez? Plus probablement non. Aussi, la personne peut-elle changer d'emploi? Sûr.
Cela justifie une person.setJob(job)
. Maintenant, la personne a une référence à son travail, mais que se passe-t-il si le travail lui-même change? La société pourrait changer de nom par exemple. Person
doit seulement connaître l'interface de JobPlace
pour fonctionner, le travail lui-même peut donc modifier et si plusieurs Person
's maintien la même référence à JobPlace
, puis Vous devez le changer uniquement au même endroit.