例如,在此代码段中:
c.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
System.out.println("Mouse entry event: " + e
+ " on button: " + buttonLabel);
}
});
Run Code Online (Sandbox Code Playgroud)
代码块是否在addMouseListener声明匿名类的括号内MouseAdapter(),然后整个事件被称为' function callback',或者我混淆了条款?有什么不同?
没有.
您可以在Java中以多种方式实现回调,匿名类是一种常见的方式,尤其是在Java 8之前.
在OO中,回调与称为好莱坞原则的原则有关:"不要打电话给我们,我们会打电话给你".请点击这里获取有关Java的回调更多的信息.
在Java中,我们只有类/对象,因此,回调总是使用Java中的对象来实现.因此,我认为我们不应该在Java中将其称为"函数回调",相反,回调对象可能更合适.
我们将一个回调对象传递给另一个对象,这样当该对象认为是时候时,该对象可以调用回调对象上的某个特定方法.在您的情况下,您将MouseAdapter实例传递给您的c.当输入鼠标时,c将调用mouseEntered传递MouseAdapter实例的方法(c认为是时间).所以,我们没有明确地调用相对于鼠标输入的c'method,如:
while(true){
if(mouce_entered){
mouseEntered();
}
wait_for_mouseentered_event();
}
Run Code Online (Sandbox Code Playgroud)
相反,c完成所有这些工作,我们只需要将一个回调对象传递给他并c控制逻辑流程.
实际上,实现此回调的第一种方法是声明一个类扩展MouseAdapter
public class YourMouseListener extends MouseAdapter()
{
public void mouseEntered(MouseEvent e) { ... }
}
Run Code Online (Sandbox Code Playgroud)
然后创建一个实例并传递给它:
c.addMouseListener(new YourMouseListener());
Run Code Online (Sandbox Code Playgroud)
2.为了最小化声明的代码和类,Java允许您使用匿名类来实现回调,如:
c.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
System.out.println("Mouse entry event: " + e
+ " on button: " + buttonLabel);
}
});
Run Code Online (Sandbox Code Playgroud)
3.在Java 8中,我们有lambda表达式,我们可以将一些匿名类替换为更简洁的lambada表达式,但这仅限于函数接口,它只有一个方法.
//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 !");
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2842 次 |
| 最近记录: |