Question

(question Java)

Si je fais référence à un champ d'une classe interne, est-ce que cela provoque une dépendance circulaire entre la classe englobante et la classe interne?

Comment puis-je éviter cela?

Voici un exemple:

public class Outer {

  private Other o;
  private Inner i;    

  public Outer() {
    o = new Other();

    i = new Inner() {
      public void doSomething() {
        o.foo();
      }
    };

  }
}
Était-ce utile?

La solution

Classe d'instance statique vs : si vous déclarez la classe interne comme étant statique, les instances de la classe interne ne font pas référence à la classe externe. Si ce n'est pas satic alors votre objet interne pointe effectivement sur l'objet externe qui l'a créé (il a une référence implicite, en fait, si vous utilisez la réflexion sur ses constructeurs, vous verrez un paramètre supplémentaire pour recevoir l'instance externe).

Instance interne désignant une instance externe: La référence circulaire correspond au cas où chaque instance pointe l'autre. Souvent, vous utilisez des classes internes pour implémenter avec élégance certaines interfaces et accéder à des champs privés sans implémenter l'interface avec la classe externe. Cela signifie que l'instance interne désigne l'instance externe mais ne signifie pas le contraire. Non nécessaire une référence circulaire.

Fermeture du cercle: Quoi qu'il en soit, le référencement circulaire en Java n’est pas un problème. Les objets fonctionnent bien et quand ils ne sont pas mieux référencés, ils sont récupérés. Peu importe qu’ils se pointent mutuellement.

Autres conseils

La syntaxe que vous utilisez dans l'exemple est un peu fausse, il n'y a pas de déclaration de la classe ou de l'interface Inner. Mais il n'y a rien de mal avec le concept de l'exemple. En Java, cela fonctionnera bien.

Je ne suis pas sûr de ce que vous faites ici, mais vous voudrez peut-être envisager une conception plus simple pour la maintenabilité, etc.

C’est un modèle courant pour les gestionnaires d’événements anonymes qui référencent des éléments de leur classe parente. Aucune raison de l’éviter si tel est le cas, c’est ainsi que Java a été conçu au lieu d’avoir des pointeurs de fonction.

(Vous ne savez pas si c'est ce que vous demandez ...)

Au moment de l'exécution, la classe interne a une référence implicite à l'instance de la classe externe à laquelle elle appartient. Ainsi, chaque fois que vous transmettez l'instance de classe interne, vous transmettez également l'instance de classe externe.
Vous pouvez éviter cela en déclarant la classe interne en tant que "statique", mais cela signifie que la classe interne ne peut pas accéder aux variables membres de la classe externe. Donc, dans ce cas, si vous souhaitez accéder à un membre de la classe externe, vous devez le transmettre explicitement à la classe interne (à l'aide d'un setter ou du constructeur de la classe interne).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top