java - Java回调中使用接口(interface)的必要性是什么?

标签 java interface callback

这两个实现有什么区别?有必要使用接口(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())提供代码(在您的情况下是OnSearchListeneronFound()方法) code>) 要求它在满足某些条件时调用我的代码。因此,如果提供的代码没有任何变化,它就不是回调。

当然,如果您可以完全控制两侧(MainSearch),并且只希望剪切一个代码来调用,则不需要回调,这是您的第二个实现。

但是如果你想要一个真正的回调,你需要一个定义方法签名的抽象,而不是要调用的实现,这通常是 Java 中的接口(interface),但(糟糕的风格!)也可能是一个抽象类甚至是普通的基类。

关于java - Java回调中使用接口(interface)的必要性是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46502791/

相关文章:

java - 实现接口(interface)时扩展包含的类型

c# - 类继承,强制新类实现某些功能

c - 如何将结构作为参数传递给回调函数

java - Casting如何限制Java中的算法重用?

java - 具有 PHP/Javascript 实现的 Twitter Stream API

java - 实现 Comparable 以使用字符串按字母顺序排序

c - 如何在 Mingw 中将 C 程序编译为 dll 以与 Inno 设置和回调一起使用

python - 如何在 Python 中通过 Plotly 从 Dash 的下拉列表中选择数据集列?

java - 与数据库的永久连接?

java - Spring 中用户相关的 bean 定义