Passer ‘this’ dans un appel de méthode pratique en java

Est-ce une bonne / mauvaise / pratique acceptable de passer l’object actuel dans un appel de méthode. Un péché:

public class Bar{ public Bar(){} public void foo(Baz baz){ // modify some values of baz } } public class Baz{ //constructor omitted public void method(){ Bar bar = new Bar(); bar.foo(this); } } 

Plus précisément, la ligne bar.foo(this) acceptable?

Il n’y a aucune raison de ne pas l’utiliser, c’est l’instance actuelle et il est parfaitement légitime de l’utiliser. En fait, il n’y a souvent pas de moyen propre de l’omettre.

Alors, utilisez-le.

Comme il est difficile de convaincre que c’est acceptable sans exemple (une réponse négative à une telle question est toujours plus facile à argumenter), je viens d’ouvrir l’une des classes java.lang les plus courantes, celle de Ssortingng , par exemple

 1084 // Argument is a Ssortingng 1085 if (cs.equals(this)) 1086 return true; 

Recherchez (this dans les grands projets “acceptés”, vous ne manquerez pas de le trouver).

Il n’y a rien de mal à cela. Ce qui n’est PAS une bonne pratique est de faire la même chose à l’intérieur des constructeurs, car vous donneriez une référence à un object pas encore complètement initialisé.

Il y a une sorte de post similaire ici: Java qui fuit cela dans un constructeur où ils expliquent pourquoi cette dernière est une mauvaise pratique.

Oui , mais vous devriez faire attention à deux choses

  1. Passer ceci lorsque l’object n’a pas encore été construit (c’est-à-dire dans son constructeur)
  2. En passant ceci à un object de longue durée, cela gardera la référence vivante et évitera que cet object ne soit collecté.

C’est parfaitement normal et parfaitement acceptable.

ceci représente l’object actuel. Ce que vous êtes en train de faire est sytatiquement correct mais je n’en vois pas le besoin si vous appelez la méthode dans la même classe.

Oui. vous pouvez l’utiliser.Il est commun dans la programmation de passer this .Mais il y a des avantages et des inconvénients à utiliser cela.Aujourd’hui, il n’est pas dangereux de le faire.

C’est une mauvaise pratique de passer l’object courant dans un appel de méthode s’il existe des alternatives moins complexes pour obtenir le même comportement.

Par définition, une association bidirectionnelle est créée dès qu’elle est transmise d’un object à un autre.

Pour citer Refactoring, par Martin Fowler:

Modifier l’association bidirectionnelle en unidirectionnel (200)

Les associations bidirectionnelles sont utiles, mais elles ont un prix. Le prix est la complexité supplémentaire liée à la maintenance des liens bidirectionnels et à la création et à la suppression correctes des objects. Les associations bidirectionnelles ne sont pas naturelles pour de nombreux programmeurs, elles sont donc souvent source d’erreurs

Vous devez utiliser des associations bidirectionnelles lorsque vous en avez besoin, mais pas lorsque vous en avez besoin. Dès que vous voyez qu’une association bidirectionnelle ne tire plus son poids, laissez tomber la fin inutile.

Donc, en théorie, nous devrions entendre des sonnettes d’alarme lorsque nous constatons que nous devons réussir this et essayer de trouver d’autres moyens de résoudre le problème. Il y a bien sûr des moments où, en dernier ressort, il est logique de le faire.

De plus, il est souvent nécessaire de corrompre temporairement votre conception, en faisant des «mauvaises pratiques», lors d’un remaniement à plus long terme de votre code pour une amélioration globale. (Un pas en arrière, deux pas en avant).

En pratique, j’ai constaté que mon code s’était considérablement amélioré en évitant les liens bidirectionnels comme la peste.

Juste pour append un autre exemple où le passage est correct et suit un bon design: le motif du visiteur . Dans le modèle de conception de visiteur, la méthode accept(Visitor v) est généralement implémentée de manière à appeler simplement v.visit(this) .

Acceptable

Extrait de la documentation Oracle JAVA:

Dans une méthode d’instance ou un constructeur, il s’agit d’une référence à l’object en cours – l’object dont la méthode ou le constructeur est appelé. Vous pouvez faire référence à n’importe quel membre de l’object actuel depuis une méthode d’instance ou un constructeur en utilisant ceci.

Utiliser ceci avec un champ

La raison la plus courante de l’utilisation du mot-clé this est qu’un champ est masqué par une méthode ou un paramètre constructeur.

Tout en Java est passé par valeur. Mais les objects ne sont JAMAIS passés à la méthode!
Lorsque java transmet un object à une méthode, il copie d’abord une référence à l’object, et non une copie de l’object lui-même. C’est donc une méthode parfaitement utilisée en Java. Et l’utilisation la plus communément suivie.