我以前从未见过这样的事情,所以让我说我有这样的倾听对象:
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;
}
};
一切正常,当一些动作成功时,将会回调适当的方法,但return
onDafuqCall
方法内部有什么问题,为什么需要它,它会返回什么东西?
P.S。此界面来自Android广告提供商的SDK。
答案 0 :(得分:3)
目前还不清楚你的要求,但我会试一试。
接口是一种允许对象遵循特定模式的方法。例如,当我有一个名为“ Listener ”的界面和五个实现时,它们会派上用场:
ActionListener,MouseListener,KeyListener,CloseListener,StateChangeListener 。
如果我想要一个允许用户注册用户的方法,而不是为每个实现创建单独的“ registerListener ”方法,我可以:registerListener(Listener l)
。
现在回到你的帖子,Interfaces可能包含带有返回值的方法,作为一个例子,如果我有一个名为Event的接口,它包含一个名为isCanceled()
的方法,它返回boolean,然后如果我有一个实现调用“ClickEvent”,我想检查这个事件(在它被调用之后)是否被任何人或任何东西取消我将调用isCanceled()
方法并且应该返回一个值,因为它是由实现对象处理的。
因此,为了将其包装起来,调用侦听器获取信息的代码片段需要返回值。如果我们查看Java接口及其实现,我们可以找到大量示例。您可以通过查看java.uti.List接口源和java.util.ArrayList之类的实现来检查自己
可以从文档中获取更多信息:
https://docs.oracle.com/javase/tutorial/java/concepts/interface.html
https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html
编辑#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的位置。这里我演示了为什么需要返回值(参见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
答案 1 :(得分:3)
这是非常正常的事情。侦听器/观察者接口与主题/事件抛出类配对。通常,您希望您的听众与主题的行为完全脱节,以至于主体既不知道也不关心注册了多少听众。这是纯粹的'图案。这是最常见的,所有方法都是无效的,因为它们只被主体调用,主体行为不依赖于它的听众。
然而,有时听众有其他方法不打算被主题调用,并且听众可以充当主题状态和程序其他部分之间的桥梁。一个常见的例子是为调试制作特殊的监听器。在这里你创建一个新的监听器,它扩展了你以前的监听器,但它也跟踪一个主题调用它的确切时间,然后它有一个带有返回值的方法,以便你的测试代码可以访问这个状态,并确切地看到它是什么听众正在做。
最后,让听众影响主体的行为偶尔会有意义。在这种情况下,返回方法是必要的。但这种情况很少见,并且没有危险,有时会使用,例如确保以正确的顺序删除链中的内容。因此,如果您未能删除子项,则会停止删除链。它有一个名字,但我不记得现在这个模式到底是什么。
答案 2 :(得分:2)
这是我对该主题的理解:
通常,监听/回叫方法不需要返回任何内容,并且响应事件而调用它们。
例如onClick()
的{{1}}方法。
OnClickListener
但是如果它们是事件链的一部分,那么布尔返回类型用于中止继续执行事件。例如来自OnClickListener onClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
//some click handling code
}
};
的{{1}}方法。
onDrag()
此方法的文档说"如果成功处理了拖动事件,则返回true;如果未处理拖动事件,则返回false。请注意,false将触发OnDragListener
调用其OnDragListener onDragListener = new OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
//some drag handling code
return false;
}
}
处理程序。"
因此,如果它们是事件链的一部分,则在回调/事件处理方法中返回并不是很常见。应该返回的内容是API文档的一部分。