2016-03-11 1 views
2

SSCCE:Est-il possible de pointer vers une classe anonyme par mot-clé .THIS?

public class Test { 
    public Test() { 
     new Anonymous1() { 
      void validate() { 
       new Anonymous2() { 
        int calculate() { 
         return Math.abs(Anonymous1.this.getValue()); // compilation error - Anonymous1 is not an enclosing class 
        } 
       }; 
      } 
     }; 
    } 
} 

abstract class Anonymous1 { 
    abstract void validate(); 

    int getValue() { 
     return 0; 
    } 
} 

abstract class Anonymous2 { 
    abstract int calculate(); 
} 

Je sais qu'il semble compliqué et inutilisable, mais je suis tout simplement se demander est-il possible de pointer vers Anonymous1 classe à partir Anonymous2 à l'aide .this pointeur, ou de quelque façon que d'autre.

+0

@SeniorJD définition de classes non totalement fixes ... –

+1

Le problème est que "Anonymous1" et "Anonymous2" ne sont pas les noms de ces classes internes. 'Anonymous1' et' Anonymous2' sont les * superclasses * de ces classes internes. Vous devez utiliser le nom réel de la classe pour 'Something.this', mais il n'y a pas de nom car ils sont anonymes. – newacct

Répondre

4

Vous devez le faire dans la classe.

public Test() { 
    new Anonymous1() { 
     void validate() { 
      final Object this1 = this; 
      new Anonymous2() { 
       int calculate() { 
        return Math.abs(this1.getValue()); 
       } 
      } 
     } 
    } 
} 

ou mieux encore, extraire les choses dont vous avez besoin d'abord et utiliser efficacement finale ajoutée en Java 8.

public Test() { 
    new Anonymous1() { 
     void validate() { 
      int value = getValue(); 
      new Anonymous2() { 
       int calculate() { 
        return Math.abs(value); 
       } 
      } 
     } 
    } 
} 

si Anonymous1 et Anonymous2 étaient des interfaces, vous pouvez utiliser lambdas en Java 8.

public Test() { 
    Anonymous1 a =() -> { 
     int v = getValue(); 
     Anonymous2 = a2 =() -> Math.abs(v); 
    }; 

}

+0

Wow, c'est excellent, merci. – SeniorJD