Почему в анонимном классе доступны только конечные переменные? - PullRequest
333 голосов
/ 19 января 2011
  1. a может быть только окончательным здесь. Зачем? Как я могу переназначить метод a в onClick(), не оставляя его закрытым?

    private void f(Button b, final int a){
        b.addClickHandler(new ClickHandler() {
    
            @Override
            public void onClick(ClickEvent event) {
                int b = a*5;
    
            }
        });
    }
    
  2. Как я могу вернуть 5 * a при нажатии? Я имею в виду,

    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 
            }
        });
    }
    

Ответы [ 13 ]

0 голосов
/ 18 июля 2018

Попробуйте этот код,

Создайте список массивов, поместите в него значение и верните его:

private ArrayList f(Button b, final int a)
{
    final ArrayList al = new ArrayList();
    b.addClickHandler(new ClickHandler() {

         @Override
        public void onClick(ClickEvent event) {
             int b = a*5;
             al.add(b);
        }
    });
    return al;
}
0 голосов
/ 24 июля 2017

Поскольку Jon имеет подробности реализации, ответ может быть другим возможным: JVM не хочет обрабатывать запись в записи, которая завершила его активацию.

Рассмотрим вариант использованиягде ваши лямбды вместо того, чтобы быть примененными, хранятся в каком-то месте и запускаются позже.

Я помню, что в Smalltalk вы получите незаконное хранилище, когда вы сделаете такую ​​модификацию.

0 голосов
/ 28 июля 2012

Может быть, этот трюк дает вам представление

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);
...