доступ к переменным внешнего класса в Java

в приложении Java для Android, как я могу получить доступ к переменным внешнего класса из внутреннего анонимного класса? Пример:

    ProgressDialog dialog = new ProgressDialog(this);
    .....
    send.setOnClickListener(new View.OnClickListener() 
    {
        public void onClick(View v) {

           //here i'd like to do something with **dialog** variable
           .......

        }
    });

person user1246620    schedule 03.03.2012    source источник


Ответы (3)


Если диалоговая переменная является полем внешнего класса, вы можете использовать this с префиксом имени внешнего класса (с уточнением this):

send.setOnClickListener(new View.OnClickListener() 
{
    public void onClick(View v) {
       ProgressDialog dlg = OuterClass.this.dialog;
       .......
    }
});

В качестве альтернативы, если переменная диалога является локальной переменной, ее необходимо пометить как final:

final ProgressDialog dialog = new ProgressDialog(this);
.....
send.setOnClickListener(new View.OnClickListener() 
{
    public void onClick(View v) {
       // The dialog variable is in scope here ...
       dialog.someMethod();
    }
});
person Rich O'Kelly    schedule 03.03.2012
comment
Это правильный ответ, когда dialog является полем внешнего класса. Я думаю, что в данном случае это локальная переменная в методе внутреннего класса. - person Arnout Engelen; 03.03.2012
comment
Я рад, что java поддерживает это, поэтому мне не нужно придумывать другое странное имя - person M.kazem Akhgary; 24.11.2018

Сделайте внешнюю локальную переменную (dialog) final, чтобы вы могли ссылаться на нее из внутреннего класса.

person Arnout Engelen    schedule 03.03.2012

Если это локальная переменная (как следует из подписи), она должна быть final, чтобы внутренний класс мог получить к ней доступ. Если это переменная-член, модификатор видимости должен быть установлен по умолчанию (без модификатора) или выше (защищенный или общедоступный). С модификатором private он все еще работает, но вы можете получить предупреждение (в зависимости от настроек вашего компилятора):

Доступ для чтения к охватывающему полю SomeClass.someField эмулируется синтетическим методом доступа.

person esaj    schedule 03.03.2012
comment
Часть о переменных-членах неверна. Внутренние классы могут обращаться к закрытым членам окружающего класса — компилятор создает скрытые методы доступа для таких членов. - person casablanca; 03.03.2012