385 votes

Pourquoi seules les variables finales sont-elles accessibles dans une classe anonyme ?

  1. a ne peuvent être finalisés qu'ici. Pourquoi ? Comment puis-je réaffecter a sur onClick() sans le garder comme membre privé ?

    private void f(Button b, final int a){
            b.addClickHandler(new ClickHandler() {
    
                @Override
                public void onClick(ClickEvent event) {
                    int b = a*5;
    
                }
            });
    }
  2. Comment puis-je renvoyer le 5*a quand ça a cliqué ? Je veux dire,

    private void f(Button b, final int a){
            b.addClickHandler(new ClickHandler() {
    
                @Override
                public void onClick(ClickEvent event) {
                     int b = a*5;
                     return b; // but return type is void 
                }
            });
    }

6voto

La raison pour laquelle l'accès a été limité aux seules variables locales finales est que si toutes les variables locales étaient rendues accessibles, elles devraient d'abord être copiées dans une section séparée où les classes internes pourraient y avoir accès et le maintien de multiples copies de variables locales mutables pourrait conduire à des données incohérentes. Alors que les variables finales sont immuables et, par conséquent, le nombre de copies n'aura aucun impact sur la cohérence des données.

2voto

S73417H Points 1558

Les méthodes d'une classe interne anonomique peuvent être invoquées bien après la fin du thread qui l'a créée. Dans votre exemple, la classe interne sera invoquée sur le thread de répartition des événements et non dans le même thread que celui qui l'a créée. Par conséquent, la portée des variables sera différente. Ainsi, pour protéger ces problèmes de portée d'affectation de variables, vous devez les déclarer finales.

1voto

ZBruce Points 19
private void f(Button b, final int a[]) {

    b.addClickHandler(new ClickHandler() {

        @Override
        public void onClick(ClickEvent event) {
            a[0] = a[0] * 5;

        }
    });
}

-2voto

user1352530 Points 987

Peut-être que cette astuce vous donnera une idée

Boolean var= new anonymousClass(){
    private String myVar; //String for example
    @Overriden public Boolean method(int i){
          //use myVar and i
    }
    public String setVar(String var){myVar=var; return this;} //Returns self instane
}.setVar("Hello").method(3);

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