gpt4 book ai didi

java - Java中的函数回调也是匿名类吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:55:15 24 4
gpt4 key购买 nike

例如在这段代码中:

c.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
System.out.println("Mouse entry event: " + e
+ " on button: " + buttonLabel);
}
});

addMouseListener 大括号内的代码块是否声明了一个匿名类 MouseAdapter() 然后整个事情称为“函数回调',还是我混淆了这些术语?有什么区别?

最佳答案

没有。

在 Java 中可以通过多种方式实现回调,匿名类是一种常见的方式,尤其是在 Java 8 之前。

在 OO 中,回调是相对于称为 Hollywood Principle 的原则而言的:“不要调用我们,我们会调用你”。检查here有关 java 回调的更多信息。

在 Java 中,我们只有类/对象,因此,回调将始终使用 Java 中的对象来实现。因此,我认为我们不应该在 Java 中将其称为“函数回调”,相反,回调对象可能更合适。

我们将回调对象传递给另一个对象,以便该对象可以在该对象认为时间到了时调用回调对象上的某些特定方法。在您的例子中,您将 MouseAdapter 实例传递给您的 c。当鼠标进入时(c 认为是时候),c 将调用传递的MouseAdapter 实例的方法mouseEntered。因此,我们不会显式调用相对于鼠标输入的 c' 方法,例如:

while(true){
if(mouce_entered){
mouseEntered();
}
wait_for_mouseentered_event();
}

相反,c 完成了所有这些工作,我们只需要将回调对象传递给他并让 c 控制逻辑流。

1.因此,实际上,实现此回调的第一种方法是声明一个扩展 MouseAdapter 的类

public class YourMouseListener extends MouseAdapter() 
{
public void mouseEntered(MouseEvent e) { ... }
}

然后创建一个实例并传递给它:

  c.addMouseListener(new YourMouseListener());

2.为了最小化声明的代码和类,Java 允许您使用匿名类来实现回调,例如:

c.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
System.out.println("Mouse entry event: " + e
+ " on button: " + buttonLabel);
}
});

3.在Java 8中,我们有了lambda表达式,我们可以将一些匿名类替换成更简洁的lambada表达式,但这仅限于只有一个方法的函数接口(interface)。

//Old way:
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("The button was clicked using old fashion code!");
}
});

//New way:
button.addActionListener( (e) -> {
System.out.println("The button was clicked. From lambda expressions !");
});

关于java - Java中的函数回调也是匿名类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27106895/

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