Объектные литералы в Java? - PullRequest
5 голосов
/ 09 марта 2010

Я изучаю GWT для веб-разработки и наткнулся на фрагмент кода, который мне не совсем понятен.

helloBtn.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
        Window.alert("Hello!");
    }
});

Если бы кто-то мог объяснить мне, что он делает, это было бы здорово.

Спасибо, Джон

Ответы [ 4 ]

11 голосов
/ 09 марта 2010

Это анонимный внутренний класс .

В этом случае код объявляет безымянный класс, который реализует интерфейс ClickHandler. При запуске экземпляр класса будет создан и передан addClickHandler.

3 голосов
/ 09 марта 2010

Полагаю, что у вас проблемы с анонимным классом. Здесь происходит то, что вы вызываете метод addClickHandler для объекта helloBtn и передаете ему экземпляр анонимного класса.

Метод addClickHandler принимает экземпляр ClickHandler в качестве аргумента. Следующий код создает анонимный класс, который реализует интерфейс ClickHandler.

new ClickHandler() {
public void onClick(ClickEvent event) {
    Window.alert("Hello!");
}

Вы можете представить, как переписать код, сначала определив класс.

public class MyClickHandler implements ClickHandler {
  public void onClick(ClickEvent event) {
    Window.alert("Hello!");
  }
}

Затем создайте экземпляр класса и передайте его методу addClickHandler.

ClickHandler myClickHandler = new MyClickHandler();
helloBtn.addClickHandler(myClickHandler);
0 голосов
/ 11 мая 2016

Другой способ переписать ваш код без использования анонимного внутреннего класса заключается в следующем:

ClickHandler myClickHandler = new ClickHandler() {
    public void onClick(ClickEvent event) {
        Window.alert("Hello!");
    }
}

Это создает объект ClickHandler, который затем может быть передан туда, где он вам нужен:

helloBtn.addClickHandler(myClickHandler);

Этот стиль будет полезен, если вы хотите использовать один и тот же ClickHandler для нескольких элементов, чтобы он мог выглядеть примерно так:

helloBtn1.addClickHandler(myClickHandler);
helloBtn2.addClickHandler(myClickHandler);
helloBtn3.addClickHandler(myClickHandler);
0 голосов
/ 09 марта 2010

Это анонимный класс - как следует из названия, класс без имени, который можно определить «на лету». В вашем примере кода он используется для реализации интерфейса ClickHandler - это несколько многословный идиома Java для обратных вызовов. Тот же синтаксис может использоваться для расширения классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...