号
您可以在Java的几种方式实现回调,匿名类是一种常见的方式,尤其是之前的Java 8
在面向对象,回调是相对于所谓的Hollywood Principle原则: “不要打电话给我们,我们会打电话给你”。有关在java中回调的更多信息,请查询here。在Java中,我们只有类/对象,因此,回调将始终使用Java中的对象实现。因此,我认为我们不应该在Java中将其称为“函数回调”,相反,回调对象可能更合适。
我们将回调对象传递给另一个对象,以便该对象在该对象认为是时间时可以调用回调对象上的某个特定方法。在你的情况下,你将MouseAdapter
实例传递给你的c
。当鼠标进入时(c认为是时间),c将调用通过MouseAdapter
实例的方法mouseEntered
。所以,我们没有专门调用相对c'method鼠标输入,如:
while(true){
if(mouce_entered){
mouseEntered();
}
wait_for_mouseentered_event();
}
相反,c
做这一切工作,我们只需要一个回调对象传递给他,让c
控制逻辑流程。
1.So,实际上,为了实现这个回调的第一种方式是声明一个类扩展MouseAdapter
public class YourMouseListener extends MouseAdapter()
{
public void mouseEntered(MouseEvent e) { ... }
}
然后创建一个实例,并给它:
c.addMouseListener(new YourMouseListener());
2.To最小化代码和类声明,Java使您可以使用匿名类来实现回调,如:
c.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
System.out.println("Mouse entry event: " + e
+ " on button: " + buttonLabel);
}
});
3.在Java 8中,我们有lambda表达式,我们可以将一些匿名类替换为更简洁的lambda表达式,但是这仅限于函数接口,它只有一个方法。
//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 !");
});
是它的一个匿名类和它的一个监听器。 [回调和监听器之间有区别](http://programmers.stackexchange.com/questions/84732/what-is-the-difference-between-callbacks-and-listeners)。 – Sikorski 2014-11-24 14:21:20