Что такое не финальная переменная? - PullRequest
3 голосов
/ 10 декабря 2011

Я не понимаю понятие переменной final.В цикле for у меня есть динамическая переменная i, для меня крайне важно ссылаться на массив.Как только я использую i, я получаю сообщение об ошибке, говорящее, что это должно быть final.

Что именно означает final?Не могли бы вы помочь избавиться от этой ошибки?

Мой код здесь:

for( int i = 0; i <4; i++)
{

   Bitmap celeb1=Bitmap.getBitmapResource(fimagearray[i]);
   Bitmap celeb1_focus=Bitmap.getBitmapResource(fimagearray[i]);
   ImageButton celebbutton = new ImageButton(celeb1, celeb1_focus);

   celebbutton.setChangeListener(new FieldChangeListener() {

       public void fieldChanged(Field field, int context) 
       {
           UiApplication.getUiApplication().pushScreen(new FetchTweets(fusernamearray[i]));

       }
   });


   femaleSec.add(celebbutton);
}

Ответы [ 3 ]

10 голосов
/ 10 декабря 2011

Анонимный внутренний класс может обращаться только к final переменным из внешней области видимости. Поскольку i не является окончательным, к нему нельзя получить прямой доступ. Вы не можете сделать i final, так как оно должно быть изменено, а финальная переменная не может быть изменена.

В качестве простого обходного пути, копируйте значение i в конечную переменную во время каждой итерации цикла:

for( int i = 0; i < 4; i++)
{
    final int index = i; // <-- copy i to `index' to use in FieldChangeListener

    // ...

    celebbutton.setChangeListener(new FieldChangeListener() {

        public void fieldChanged(Field field, int context) 
        {
            UiApplication.getUiApplication().pushScreen(
               new FetchTweets(fusernamearray[index])); // <-- `index'
        }
    });


    femaleSec.add(celebbutton);
}
2 голосов
/ 10 декабря 2011

Вы пытаетесь использовать значение i внутри «Анонимного внутреннего класса», который требует, чтобы все нелокальные переменные этого класса были объявлены как final, что означает, что значение переменной нельзя изменить один раз оно было инициализировано.

Решение, опубликованное @aix, решит вашу проблему.

2 голосов
/ 10 декабря 2011

Окончательная переменная может быть инициализирована только один раз, либо через инициализатор, либо через оператор присваивания

Проверьте ссылку this .

Также посмотрите на этот Пример.

...