Est une auto-référence à un objet de la preuve de la mauvaise conception de code
Je suis tombé sur un auto de référence dans le code que je regardais.
Exemple
TestObject selfReference = this;
Est-il jamais une bonne affaire dans laquelle vous avez besoin d'une auto-référence à un objet? Est-ce le signe d'un mauvais codage du design ou de style?
EDIT:
C'est un exemple de cas où si j'utilise this
il lèvera une erreur, mais lors de l'utilisation de selfReference, il compile.
public class IFrame extends InternalFrame
{
public IFrame()
{
addComponentListener(new java.awt.event.ComponentAdapter()
{
public void componentResized(java.awt.event.ComponentEvent evt)
{
Window.setCurrComponent(this); //compile error
}
public void componentMoved(ComponentEvent evt)
{
Window.setCurrComponent(selfReference); //compiles correctly
}
});
}
}
public class InternalFrame extends JInternalFrame
{
protected InternalFrame selfReference = this;
}
public class Window
{
InternalFrame currFrame;
public static void setCurrComponent(InternalFrame iFrame)
{
currFrame = iFrame
}
}
- Quel est le contexte plus large de ce code? Je ne vois pas pourquoi vous auriez besoin d'un alias pour
this
(en Java). Maintenant, si cette variable peut également pointer vers quelque chose d'autre, selon certaines conditions, il peut y avoir de bonnes raisons pour cela. Mais pas une seule, appeléeselfReference
. Sans plus de contexte, la question est assez vague. - Je suis un peu confus quant à pourquoi cette question a donc beaucoup d'activité et d'intérêt, mais il n'y a pas de voix.
- Je suis un peu confus par l'intérêt, étant donné que la question est vague et que l'OP n'a pas tenu compte des demandes de clarification. Les gens sont juste dans l'humeur allez le deviner, je suppose.
- J'ai demandé autour, et j'ai fait un edit à ce qu'il paraît se passe. Aussi, il y a eu jusqu'voix, tout autant que de nombreux votes contre
- Votre nouvelle édition n'a pas de sens. La méthode dans la sous-classe toujours être invoquée si elle est remplacée. (La méthode n'est pas surchargée dans votre exemple)
- Veuillez voir la nouvelle édition de
- Oui, c'est sans doute pourquoi il avait un selfReference. Toutefois, de noter que vous n'en a pas besoin (en raison du fait qu'il peut accéder à l'extérieure ce)
- Notez que dans la mise à jour de votre exemple, vous pouvez simplement faire
Window.setCurrComponent(IFrame.this)
.
Vous devez vous connecter pour publier un commentaire.
Oui, il y a des circonstances dans lesquelles une implicite auto-référence peut être entièrement naturel. Considérons, par exemple, une circulaire de la liste, qui, actuellement, ne contient qu'un seul élément.
Toutefois, avoir un membre de la variable appelée
selfReference
ne fait aucun sens du tout.head
. 😉final
variable, je suis d'accord avec vous. Sinon, cela permet à l'TestObject
à cet objet ou à un autre - de la configuration initiale à cet objet. Pas de problème avec ça. Bien sûr, le nom est maladroit.Je vais prendre un coup de couteau sur le présent. Je suppose que l'auteur de ce code ne saviez pas que vous pouvez écrire le nom de la Classe.lorsque vous souhaitez accéder à "l'extérieur" dans un imbriquée classs.
Qui est, il a créé une structure comme ceci:
Pas nécessaire.
Parfaitement valide pour l'auto-référence est un objet qui a besoin de quelques handler. Si l'objet implémente que gestionnaire de l'interface elle-même, la référence à l'gestionnaire est la référence au même objet. Totalement OK, à mon humble avis.
Je dirais une auto de référence est un signe de mauvais code en Java, surtout si c'est un nom du type "selfReference," parce que Java a déjà un self standard de référence nommé "cette". C'est une autre histoire, dans des langues qui prennent en charge les fermetures, car non, cette auto-référence peut garder le "présent" de l'objet dans le champ d'application de la fermeture.
Sans plus de contexte, le code n'est pas de faire quelque chose d'utile et est potentiellement source de confusion. Je ne pense pas qu'il qualifie de "conception" ou "style".
Cependant plus de contexte qui pourraient montrer pourquoi il est fait.
Je dirais que c'est un signe de mauvais code:
this
signifie donc je ne vois pas la nécessité d'une référence,selfReference
TestObject selfReference = ce;
//appel de certaines fonctions sur ce
selfReference = someOtherObject; //où someOtherObject est une instance de TestObject ainsi
//appel de certaines fonctions sur someOtherObjects
selfReference
-- comme il peut finissent pas référence à l'autonomie/ce!Avec la mise à jour du code de l'échantillon, il semble que vous avez de la difficulté du référencement de l'objet extérieur à partir d'un anonyme intérieur de la classe. La syntaxe est la suivante:
OuterClass.this
Dans votre cas:
Si vous venez d'utiliser
this
seul, vous faites référence à lanew ComponentAdapter()
.Merci pour le contexte supplémentaire.
Fenêtre.setCurrComponent(this); //erreur de compilation
"il" dans la déclaration ci-dessus n'est pas InternalFrame objet de son ComponentAdapter objet, comme tu es en Anonyme intérieur de la classe.
Fenêtre.setCurrComponent(selfReference); //compile correctement
ligne ci-dessus est correct si vous souhaitez référencer votre IFrame de la classe de l'objet.
Si vous êtes à la rédaction d'un analyseur et un discbased qui contient les éléments enfants du même type, alors vous auriez besoin d'avoir des variables membres de la même classe.
Il y a beaucoup de moments où vous souhaitez utiliser un
this
. Vous devez, dans les situations où vous avez besoin de faire référence à l'objet auquel elle appartient. Je ne vois pas de raison de créer un objet dethis
cependant, un simplethis.attribute
suffira.this.selfReference = this;
this
? praticable à d'autres fonctions? estthis
pas?