gpt4 book ai didi

java - Java 中的委托(delegate)与回调

转载 作者:太空狗 更新时间:2023-10-29 22:42:52 24 4
gpt4 key购买 nike

我对 Java 中的委托(delegate)和回调术语有一些误解。

class MyDriver {

public static void main(String[] argv){
MyObject myObj = new MyObject();
// definition of HelpCallback omitted for brevity
myObj.getHelp(new HelpCallback () {
@Override
public void call(int result) {
System.out.println("Help Callback: "+result);
}
});
}
}

class MyObject {

public void getHelp(HelpCallback callback){
//do something
callback.call(OK);
}
}

是回调还是委托(delegate)(Are delegates and callbacks the same or similar?)?

那另一个怎么实现呢?

最佳答案

这是一个回调。 According to Wikipedia :

In computer programming, a callback is a reference to a piece of executable code that is passed as an argument to other code.

那么让我们看一下可执行代码:

public void getHelp(HelpCallback callback){
//do something
callback.call(OK);
}

这里,callback 参数是对 HelpCallback 类型对象的引用。由于该引用作为参数传入,因此它是一个回调。

授权示例

委派由对象在内部完成——与调用方法的方式无关。例如,如果 callback 变量不是参数,而是实例变量:

class MyDriver {

public static void main(String[] argv){
// definition of HelpStrategy omitted for brevity
MyObject myObj = new MyObject(new HelpStrategy() {
@Override
public void getHelp() {
System.out.println("Getting help!");
}
});
myObj.getHelp();
}

}

class MyObject {
private final HelpStrategy helpStrategy;

public MyObject(HelpStrategy helpStrategy) {
this.helpStrategy = helpStrategy;
}

public void getHelp(){
helpStrategy.getHelp();
}
}

...那么就是委托(delegate)。

这里,MyObject 使用 strategy pattern .有两点需要注意:

  1. getHelp() 的调用不涉及传递对可执行代码的引用。也就是说,这不是回调。
  2. MyObject.getHelp() 调用 helpStrategy.getHelp() 的事实在 MyObject 对象的公共(public)接口(interface)中并不明显,或者来自 getHelp() 调用。这种information hiding有点像委派的特征。

另外值得注意的是 getHelp() 方法中缺少 //do something 部分。使用回调时,回调不会做任何与对象行为相关的事情:它只是以某种方式通知调用者,这就是为什么 //do something 部分是必要的。然而,当使用委托(delegate)时,方法的实际行为取决于委托(delegate) - 所以我们最终可能需要两者,因为它们服务于不同的目的:

    public void getHelp(HelpCallback callback){
helpStrategy.getHelp(); // perform logic / behavior; "do something" as some might say
if(callback != null) {
callback.call(); // invoke the callback, to notify the caller of something
}
}

关于java - Java 中的委托(delegate)与回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12654943/

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