51 votes

Comment obtenez-vous une référence à la classe englobante d'un anonyme intérieur de la classe en Java?

Je suis actuellement à la création d'une référence explicite à cette à l'extérieur de la classe alors que j'ai un nom pour désigner dans l'anonymat intérieur de la classe. Est-il une meilleure façon de le faire?

89voto

Frank Krueger Points 27508

Je viens de trouver cette récemment. Utiliser OuterClassName.this.

class Outer {
    void foo() {
        new Thread() {
            public void run() {
                Outer.this.bar();
            }
        }.start();
    }
    void bar() {
        System.out.println("BAR!");
    }
}

Mis à jour Si vous voulez juste l'objet lui-même (au lieu d'invoquer des membres), alors Outer.this est le chemin à parcourir.

20voto

John Topley Points 58789

Utiliser EnclosingClass.this

1voto

Scott Stanchfield Points 15863

Vous pouvez toujours utiliser Outer.class pour obtenir la classe de l'extérieur de la classe de l'objet (qui reviendra de la même Classe d'objet Extérieur.c'.getClass() mais il est plus efficace)

Si vous souhaitez accéder à la statique dans la classe englobante, vous pouvez utiliser Extérieure.nom où nom est le champ statique ou de la méthode.

-1voto

Herms Points 13069

Je crois que, en général, vous pouvez utiliser "ce", ou tout simplement laisser complètement. Le code à l'intérieur de la classe devrait être en mesure de référence de l'extérieur de la classe des membres sans aucun problème. La seule fois où vous avez besoin d'utiliser la version plus détaillée "Extérieur.ce" s'il y a des conflits de nom. Donc, pour développer sur Frank commentaire:

class Outer {
  void foo() {
    new Thread() {
      public void run() {
        this.bar();
        Outer.this.baz();
      }

      public void baz() { }
    }.start();
  }
  void bar() {
    System.out.println("BAR!");
  }
  void baz() {
    System.out.println("BAZ!");
  }
}

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