Java, передать переменную в inner class

Makc500

 Есть такая процедура, которая создает обработчики нажатий на кнопку:

     for ( int i = 0; i<MAX_BUTTONS;i++){
     Buttons[i] = (Button) findViewById(ButtonsID[i]);
     Buttons[i].setOnClickListener(new View.OnClickListener{
     public void onClick(View v){
     тут должна быть херь, зависящая от i;
     }
     });
     }

Сейчас он пишет: Cannot refer to a non-final variable text inside an inner class defined in a different method
Как с этим борются?

Dasar

такое не помогает?

for ( int _i = 0; _i<MAX_BUTTONS;_i++){
int i = _i;

Makc500

Нет, вроде. А что изменилось? Она все равно внешняя.

Makc500

for ( int _i = 0; _i<MAX_BUTTONS;_i++){
final int i = _i;
О, так работает.

Dasar

была надежда, что может она с non-final(хз, что такое, первый раз слышу) поменяется на final.

Makc500

Final это типа const.

Makc500

Но мне кажется, это некошерно )

milanadiana

так работает нормально? просто я всегда передавал через конструктор листенера. теперь буду делать так, если так нормально.

Dasar

так работает нормально?
в шарпе такое работает нормально.
в java-е тоже должно, т.к. никакой мистики не должно быть.

bleyman

В шарпе и жаве принципиально по-разному устроены замыкания. Но да, если с final жрёт, то должно работать.

Dasar

В шарпе и жаве принципиально по-разному устроены замыкания.
в чем именно разница?

danilov

Нет. В случае переменной ей звапрещается переприсваивание, в случае метода - override, в случае класса - наследование

6yrop

В шарпе и жаве принципиально по-разному устроены замыкания. Но да, если с final жрёт, то должно работать.
тк полного замыкания в джаве и нет, его только собираются вводить в следующей версии вместе лямбдами

milanadiana

а в шарпе есть лямбды? (ударение на слове есть, я просто не знаком с шарпом)

klyv

есть.
Оставить комментарий
Имя или ник:
Комментарий: