gpt4 book ai didi

java - 匿名类重写与传递接口(interface),用于在 Java 中设计回调

转载 作者:行者123 更新时间:2023-12-01 18:58:24 25 4
gpt4 key购买 nike

我知道在 Java 中执行回调类型功能有 3 种不同的方法,但我并不完全理解每种方法的优缺点。

Java API 具有丰富的与此类似的方法:

Button b = new Button();
b.setClickListener(<implements ClickListener>);

我使用“按钮”作为通用示例,而不是指任何特定的 API。

1.) 使用它的一种方法是让您的类实现该接口(interface)并将其作为参数传递。要处理多个“按钮”,您必须使用调用者向回调提供的任何信息来区分。

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 似乎是最“简单”的。不需要做各种接口(interface),回调函数总是在初始化的地方。

所以我的问题是:在考虑这些设计选择时,哪些因素会发挥作用?

最佳答案

选项 1 通常很方便,但如果您想监听多个对象,就会出现问题,因为您必须显式检查哪个对象触发了回调。

选项 2 避免了这个问题,因为每个监听器都是独立的;它是三种方法中最灵活的。

选项 3 是一个坏主意,因为您本质上是接管 Button,而不是监听事件(即,这根本不是真正的回调);您可能会干扰对该按钮感兴趣的其他代码,并且该代码将更难以扩展。不要追随黑暗面;-)。

而且通常您不会编写调用回调的类...

关于java - 匿名类重写与传递接口(interface),用于在 Java 中设计回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13203966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com