Pourquoi les IDE se plaignent-ils de la "fuite de ceci dans le constructeur" ? J'ai toujours supposé que c'était simplement une mauvaise pratique. Mais je n'ai jamais trouvé pourquoi c'est mauvais.
Réponses
Trop de publicités?Fuite de la this
référence dans la Constructeur (non contrôleur) est dangereux, surtout dans un environnement multithread. En effet, l'objet n'est pas entièrement construit tant que l'appel au constructeur n'est pas terminé. Fuite de this
du constructeur signifie donc que le monde extérieur a accès à un objet qui n'est pas encore complètement construit. Cela n'entraîne pas nécessairement des problèmes dans un programme monofil (bien que cela soit possible, mais le problème est beaucoup plus évident dans ce cas). Mais si this
est divulguée à d'autres threads, ceux-ci peuvent en fait essayer de faire quelque chose avec l'objet avant que sa construction ne soit terminée, ce qui conduit à des bogues subtils et difficiles à trouver.
Il y a peu d'absolus dans la vie, par exemple, vous devez payer des impôts... ou... la mort est inévitable. Mais "passer this
hors d'un constructeur est toujours mauvais" n'est -pas- l'un d'entre eux.
Les mises en garde signalées par Peter sont toutes pertinentes et valables. Il serait certainement problématique de faire fuir this
d'un constructeur dans une méthode ou un contexte dans lequel la référence serait publiée à des clients inconnus ou non fiables. Il est toujours mauvais de publier une référence pour un objet pas encore complètement construit à tout code client, de confiance ou non, qui fonctionne en supposant qu'il aura une vue sur un objet valide et cohérent.
Cela dit, il n'y a absolument rien de mal à faire passer this
d'un constructeur à une méthode privée de paquetage qui effectue une initialisation commune sur, par exemple, un groupe d'objets qui partagent une interface commune, particulièrement si cette initialisation est longue ou complexe.
TL;DR : Il y a certainement des situations dans lesquelles, à mon avis, il est non seulement acceptable de passer this
d'un constructeur, mais il est en fait souhaitable de le faire.