Как использовать вход внешнего метода в анонимном внутреннем классе? - PullRequest
1 голос
/ 16 декабря 2011

Например, как я могу использовать входные данные hasTypedSomeToken в моем внутреннем классе Anonymou в следующем:

    public class Login {

        void display(boolean hasTypedSomeToken)
        {
           //some code here

               Button btnLogIn = new Button("Login", new ClickHandler() {

                @Override
                public void onClick(ClickEvent event) {

                    if(Login.this.hasTypedSomeToken) //HOW TO USE hasTypedSomeToken HERE 
                    {

                    //do something

                    }
                }
          }
      }

Ответы [ 4 ]

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

Прежде всего, вы должны сделать это final:

void display(final boolean hasTypedSomeToken)

Тогда вы можете обратиться к нему просто как hasTypedSomeToken:

if (hasTypedSomeToken) ...
2 голосов
/ 16 декабря 2011

Переменные, объявленные в методе, являются локальными переменными.Например, hasTypedSomeToken и btnLogIn являются локальными переменными в вашем методе display.

И если вы хотите использовать эти переменные внутри локального внутреннего класса (классы, которые определены внутри метода, например, анонимный класс, которыйреализует ClickHandler в вашем случае) тогда вы должны объявить их final.

например

void display(final boolean hasTypedSomeToken) {

Если вы посмотрите на Login.this.hasTypedSomeToken, this используется для доступа к членупеременные.Локальные переменные не являются членами класса.Это автоматические переменные, которые живут только внутри метода.

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

Сделать переменную final:

public class Login {

    void display(final boolean hasTypedSomeToken) {
        Button btnLogIn = new Button("Login", new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {

                if (hasTypedSomeToken) {
                    // frob a widget
                }
            }
        });
    }
}
2 голосов
/ 16 декабря 2011

Вам нужно объявить его final, например void display(final boolean hasTypedSomeToken), и использовать его без префиксов: if(hasTypedSomeToken).

...