45 votes

Java laisse échapper ceci dans le constructeur

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.

84voto

Péter Török Points 72981

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.

17voto

scottb Points 1766

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X