我正在学习用于Web开发的GWT,并遇到了一段我无法理解的代码。
helloBtn.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
Window.alert("Hello!");
}
});
如果有人能向我解释它的作用会很棒。
谢谢,约翰
答案 0 :(得分:11)
在这种情况下,代码声明一个实现ClickHandler
接口的未命名类。运行时,将创建该类的实例并将其传递给addClickHandler
。
答案 1 :(得分:3)
我认为您遇到麻烦的部分是匿名课程。这里发生的是你在helloBtn对象上调用addClickHandler方法并向它传递一个匿名类实例。
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);
答案 2 :(得分:0)
这是一个anonymous class - 顾名思义,一个没有名字的类可以“动态”定义。在您的示例代码中,它用于实现接口ClickHandler
- 这是Java有点冗长的回调习惯用法。可以使用相同的语法来扩展类。
答案 3 :(得分:0)
在不使用匿名内部类的情况下重写代码的另一种方法如下:
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);