282 votes

Obtention de l'objet de classe externe à partir de l'objet de classe interne

J'ai le code suivant. Je veux obtenir de l'extérieur de la classe de l'objet à l'aide de laquelle j'ai créé l'intérieur de la classe d'objet inner. Comment puis-je le faire?

public class OuterClass {

    public class InnerClass {
    	private String name = "Peakit";
    }

    public static void main(String[] args) {
    	OuterClass outer = new OuterClass();
    	InnerClass inner = outer.new InnerClass();
       // How to get the same outer object which created the inner object back?
    	OuterClass anotherOuter = ?? ;

        if(anotherOuter == outer) {
             System.out.println("Was able to reach out to the outer object via inner !!");
        } else {
             System.out.println("No luck :-( ");
        }
    }
}

EDIT: eh Bien, certains d'entre vous les gars a suggéré de modifier l'intérieur de la classe par l'ajout d'une méthode:

public OuterClass outer() {
   return OuterClass.this;
}

Mais que faire si je n'ai pas le contrôle de modifier l'intérieur de la classe, puis (juste pour confirmer) avons-nous une autre façon d'obtenir le correspondant externe objet de classe de l'intérieur de la classe de l'objet?

374voto

Jon Skeet Points 692016

Dans l'intérieur de la classe elle-même, vous pouvez utiliser OuterClass.this.

Je ne pense que il y a un moyen d'obtenir l'instance de l'extérieur du code de l'intérieur de la classe. Bien sûr, vous pouvez toujours introduire votre propre propriété:

public OuterClass getOuter() {
    return OuterClass.this;
}

EDIT: Par l'expérimentation, il semble que le champ de la tenue de la référence à l'extérieur de la classe a au niveau du package d'accès - au moins avec le JDK je suis en utilisant.

EDIT: Le nom utilisé (this$0) est en fait valide en Java, bien que la JLS décourage son utilisation:

L' $ caractère doit être utilisé uniquement dans mécaniquement code source généré ou, rarement, pour accéder à la pré-existantes, les noms sur les systèmes existants.

42voto

bmargulies Points 49855

OuterClass.this référence la classe externe.

25voto

Lukas Eder Points 48046

Vous pourriez (mais vous ne devriez pas) utiliser la réflexion pour le travail:

 import java.lang.reflect.Field;

public class Outer {
    public class Inner {
    }

    public static void main(String[] args) throws Exception {

        // Create the inner instance
        Inner inner = new Outer().new Inner();

        // Get the implicit reference from the inner to the outer instance
        // ... make it accessible, as it has default visibility
        Field field = Inner.class.getDeclaredField("this$0");
        field.setAccessible(true);

        // Dereference and cast it
        Outer outer = (Outer) field.get(inner);
        System.out.println(outer);
    }
}
 

Bien sûr, le nom de la référence implicite n'est absolument pas fiable, alors comme je l'ai dit, vous ne devriez pas :-)

0voto

Brian T. Hannan Points 19

Je pense que cela peut être un abus de l'utilisation d'une classe interne. Il me semble que ce que vous voulez faire, c'est violer les concepts fondamentaux de la programmation orientée objet. Si vous souhaitez accéder à la classe externe à partir de la classe interne, incluez une référence à la classe externe afin d'y accéder. Lorsque vous devez faire des choses délicates comme celle-ci, c'est généralement un signe que vous devriez revoir vos choix de conception.

-4voto

unholysampler Points 9454

Honnêtement, il ne semble pas naturel de vouloir faire cela. Si la classe interne dépend de l'objet qui l'a créée, est-ce que la partition est vraiment la meilleure façon de faire ce que vous voulez?

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