2009-10-29 5 views
2

normalement je mets en œuvre mes runnables comme suit (classe interne directement mis en œuvre):Java Direclty de classe interne implémenté avec Parameter Constructor?

Runnable updateRunnable = new Runnable() { 

    public void run() { 
    } 
} 

Est-il possible de travailler en Java pour implémenter la classe en passant des paramètres dans le constructeur comme suit?

Runnable updateRunnable = new Runnable(locale) { 

    Locale locale = null; 

    public Runnable(Locale locale){ 
     this.locale = locale 
    } 

    public void run() { 
    } 
}; 

==> Mon but est d'avoir une classe interne directement implémentée mais je veux passer un paramètre. Quelle est la meilleure solution pour faire cela (l'exemple ci-dessus ne semble pas fonctionner ????) Est la seule possibilité de travailler avec des fixateurs getter ou d'implémenter la classe comme une classe interne "normale" (ce n'est pas direclty implémenté).

merci beaucoup! janvier

Répondre

5

Vous pouvez faire quelque chose de similaire:

final Locale locale; 
Runnable r = new Runnable() { 
    public void run() { 
     // have direct access to variable 'locale' 
    } 
}; 

La chose importante à noter est que le Locale vous passez doit être final pour que vous puissiez le faire.

Vous devez d'abord initialiser locale pour que cela compile.

+0

bonjour jjnguy, merci beaucoup pour votre solution utile! jan – jan

+0

Ouais! Aucun problème. Heureux de vous aider. – jjnguy

+1

En fait, il n'est pas nécessaire d'utiliser un champ local pour cela. Vous pouvez accéder à la variable 'locale' directement à partir de la méthode' run'. Si ma mémoire ne me manque pas, elle deviendra alors un champ implicite dans l'objet 'Runnable', ajouté par le compilateur. – gustafc

2

L'autre option consiste à utiliser une classe interne statique.

public class MyClass { 

    public void someMethod() { 
     Runnable runnable = new MyRunnable(someLocaleHere); 
    } 

    private static class MyRunnable implements Runnable { 
     Locale locale = null; 

     private MyRunnable(Locale locale) { 
      this.locale = locale; 
     } 

     public void run() { 
     } 
    } 
} 

Selon la façon dont vous voyez les choses l'inconvénient de cette approche est que le MyRunnable ne peut pas accéder à la variable locale finale comme l'autre technique décrite ici.