J'ai suivi deux règles sur les constructeurs afin de minimiser les problèmes qui sont la raison pour laquelle je ne voudrais pas utiliser la méthode mutateur:
Les constructeurs (de classes non-finales) doit appeler uniquement finale du ou des méthodes privées. Si vous décidez d'ignorer cette règle et de laisser l'appel du constructeur de la non-final/non-méthodes privées, alors:
- ces méthodes et les méthodes qu'ils peuvent appeler devez être prudent de ne pas assumer l'instance est complètement initialisé, et
- les sous-classes qui remplacent ces méthodes (sous-classes qui peuvent même ne pas être conscient que le constructeur de la superclasse est des appels à ces méthodes) ne doit pas supposer que le constructeur de sous-classe et super-classes des constructeurs ont été entièrement exécutée. Ce problème s'aggrave le plus profond en bas de la hiérarchie d'héritage de la classe mère avec le "mal" constructeur est.
Est tout ce qui cognitif supplémentaire de bagages en vaut la peine? Vous pouvez autoriser une exception pour la simple mutateurs que seulement affecter une valeur à une variable d'instance, puisqu'il y a peu d'avantages, même ce qui ne semble pas en valoir la peine.
[[ @Jon Skeet mentionne dans sa réponse: "... En particulier, l'appel d'une méthode redéfinie à partir d'un constructeur est une recette pour un dur-à-la compréhension du code et difficiles à repérer les bogues." Mais je ne pense pas que les conséquences de ce problème est assez souligné. ]]
Les constructeurs devraient être prudents au sujet des fuites this
avant que l'instance est complètement initialisé. Alors que la règle précédente était sur les méthodes à l'intérieur de la classe et sous-classes accéder à ivars, vous devez aussi être prudent quant à l' (même final/privé) des méthodes de passage this
pour les autres classes et les fonctions de l'utilitaire avant d' this
est complètement initialisé. Le plus non-privé, des méthodes substituables que le constructeur appelle, plus le risque de fuites this
.
Un ouvrage de référence sur les constructeurs d'appel non définitif, non-privé méthodes:
http://benpryor.com/blog/2008/01/02/dont-call-subclass-methods-from-a-superclass-constructor/