这两个实现有什么区别?有必要使用接口(interface)吗?
第一个片段使用接口(interface),第二个则不使用
// interface implementation of callback
interface OnSearchListener {
void onFound(String result);
}
class Main {
public static void main(String[] args) {
Search search = new Search();
search.searchForSomething(new OnSearchListener() {
@Override
public void onFound(String result) {
System.out.println(result);
}
});
}
}
class Search {
public void searchForSomething(OnSearchListener searchListener) {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(200);
System.out.println("searching....");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
searchListener.onFound("found some result");
}
}
****************
这是一个不使用接口(interface)的回调
class Search {
public void searchForSomething() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(200);
System.out.println("searching....");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Main main = new Main();
main.onFound("found some result");
}
}
class Main {
public void onFound(String result) {
System.out.println(result);
}
public static void main(String[] args) {
Search search = new Search();
search.searchForSomething();
}
}
在回调中使用接口(interface)的重要性是什么?不使用它的优点和缺点是什么?
最佳答案
术语“回调”不适合第二个实现,因为这只是一个固定的方法调用。
“回调”意味着我向某个函数(searchForSomething()
)提供代码(在您的情况下是OnSearchListener
的onFound()
方法) code>) 要求它在满足某些条件时调用我的代码。因此,如果提供的代码没有任何变化,它就不是回调。
当然,如果您可以完全控制两侧(Main
和 Search
),并且只希望剪切一个代码来调用,则不需要回调,这是您的第二个实现。
但是如果你想要一个真正的回调,你需要一个定义方法签名的抽象,而不是要调用的实现,这通常是 Java 中的接口(interface),但(糟糕的风格!)也可能是一个抽象类甚至是普通的基类。
关于java - Java回调中使用接口(interface)的必要性是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46502791/