为什么回调方法需要 return 东西?

Why does a callback method needs to return something?

我以前从未见过这样的东西,所以假设我有这样的侦听器对象:

MyWhateverListener dafuqListener = new MyWhateverListener() {

  @Override
  public void onSuccessCall(String s) {
    // success call
  }

  @Override
  public void onFailCall(boolean b) {
    // fail call
  }

  @Override
  public boolean onDafuqCall(int i, boolean b) {
      // some whatever code
      return false;
  }
};

一切都很好,当某些操作成功时,将回调适当的方法,但是 returnonDafuqCall 方法中有什么用,为什么需要它,它会在哪里 return 什么?

P.S。此界面来自 Android 广告提供商的 SDK。

不太清楚你问的是什么,但我会试一试。

接口是一种允许对象遵循特定模式的方法。它们会派上用场,例如,当我有一个名为“Listener”的接口和五个实现时: ActionListener、MouseListener、KeyListener、CloseListener、StateChangeListener. 如果我想要一个允许用户注册用户的方法,而不是必须为每个实现单独制作“registerListener”方法,我可以有:registerListener(Listener l)

现在回到您的 post,接口可能包含具有 return 值的方法,例如,如果我有一个名为 Event 的接口,它包含一个名为 isCanceled() 的方法returns 布尔值,然后如果我有一个名为 "ClickEvent" 的实现并且我想检查此事件(在它被调用之后)是否被任何人或任何事物取消,我将调用 isCanceled() 方法并且应该 return 一个值,因为它是由实现对象处理的。

因此,总结一下,调用侦听器以获取信息的代码段需要 return 值。如果我们查看 Java 接口及其实现,我们可以找到大量示例。您可以通过查看 java.uti.List 接口源和类似 java.util.ArrayList

的实现来自行检查

可以从文档中获取更多信息:

编辑 #1: 这是上面解释的示例,用代码表示:

事件接口:

package com.fillpant.examples;

public interface Event {

    public boolean isCanceled();
    public void setCanceled(boolean value);

}

ClickEvent(实现事件):

package com.fillpant.examples;

public class ClickEvent implements Event {

    private boolean canceled = false;

    @Override
    public boolean isCanceled() {
        return canceled;
    }

    @Override
    public void setCanceled(boolean value) {
        canceled = value;
    }

}

ClickEvent调用的地方。在这里我演示为什么需要 return 值(参见 isCanceled() 方法):

package com.fillpant.examples;

public class EventCaller {
//This class calls an event, and all the listeners will have to handle it;

    public void callClickEvent(){
        Event e = new ClickEvent();
        for(Listener l : all_registered_listeners){//this is hypothetical, if we had listeners.
            l.event(e);
        }
        if(e.isCanceled()) return;
        else{
            //DoStuff
        }
    }

}

如果您有任何问题,请随时提问 :D

这真的是很正常的事情。 listener/observer 接口与 subject/event 抛出 class 配对。通常,您希望听众与主体的行为完全脱节,以至于主体既不知道也不关心注册了多少听众。这是 'pure' 模式。这是最常见的,所有方法都无效是有意义的,因为它们仅由主题调用并且主题行为不依赖于它的听众。

但是,有时侦听器拥有主体不打算调用的其他方法,并且侦听器充当主体状态与程序其他部分之间的桥梁是有意义的。一个常见的例子是为调试制作特殊的侦听器。在这里你创建了一个新的监听器,它扩展了你以前的监听器,但它也会准确地跟踪它何时被一个主题调用,然后它有一个带有 return 值的方法,这样你的测试代码就可以访问这个状态,并且确切地看到那个听众在做什么。

最后,拥有影响主体行为的侦听器有时是有意义的。在这种情况下,return 方法是必需的。但这很少见而且并非没有危险,有时会被使用,例如确保以正确的顺序在链中删除内容。因此,如果您未能删除 child,您将停止删除链。它有一个名字,但我现在不记得这个模式到底叫什么了。

这是我对这个话题的理解: 通常 Listener/call-back 方法不需要 return 任何东西,它们被调用以响应事件。 例如onClick() OnClickListener 的方法。

OnClickListener onClickListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        //some click handling code
    }
};

但是如果它们是事件链的一部分,那么布尔 return 类型用于中止或继续执行事件。例如onDrag() 方法来自 OnDragListener.

OnDragListener onDragListener = new OnDragListener() {
    @Override
    public boolean onDrag(View v, DragEvent event) {
        //some drag handling code
        return false;
    }
}

此方法的文档说 "return true if the drag event was handled successfully, or false if the drag event was not handled. Note that false will trigger the View to call its onDragEvent() handler." 因此,如果它们是事件链的一部分,那么在 call-back/event-handling 方法中使用 return 并不少见。应该 returned 的是 API.

文档的一部分