【发布时间】:2012-11-02 22:37:49
【问题描述】:
我知道在 Java 中实现回调类型功能的 3 种不同方法,但我并不完全了解每种方法的优缺点。
Java API 有很多本质上与此类似的方法:
Button b = new Button();
b.setClickListener(<implements ClickListener>);
我使用“按钮”作为一个通用示例,而不是指任何特定的 API。
1.) 使用它的一种方法是让您的类实现接口并将其作为参数传递。要处理多个“按钮”,您必须使用调用者提供给回调的任何信息来区分。
MyClass implements ClickListener
...
Button b = new Button();
b.setClickListener(this);
...
public void click(ButtonEvent e)
{
...
2.) 另一种方法是在现场创建一个匿名 ClickListener,并让其“click”方法包含您要执行的代码。这有一些额外的好处,因为您可以使用本地最终变量向回调添加新参数。
for(int i=0 ; i<10 ; i++)
{
final int finali = i;
buttons[i] = new Button();
buttons[i].setClickListener(new ClickListener()
{
public void click()
{
buttonClick(finali);
}
});
}
3.) 如果您正在编写调用回调的类,则最后一种方法是可能的。您可以匿名覆盖您想要捕获的回调方法。最明显的缺点是无法在对象生命周期内切换回调。
for(int i=0 ; i<10 ; i++)
{
final int finali = i;
buttons[i] = new Button()
{
public void click()
{
buttonClick(finali);
}
}
}
选项 3 在许多方面似乎是最“简单”的。不需要制作各种接口,回调函数总是在初始化的地方。
所以我的问题是:在考虑这些设计选择时,哪些因素会起作用?
【问题讨论】:
-
你忘记了另一个重要的“选项”,一个独立的处理程序类,如果你愿意的话,还有一个 control 类。
标签: java interface callback anonymous