zoukankan      html  css  js  c++  java
  • Java回调实现

    一。回调的形式

    1. C、C++和Pascal允许将函数指针作为参数传递给其它函数。JavaScript,Python,和PHP允许简单的将函数名作为参数传递。

    2. .NET Framework的语言中,提供了一种型别安全的引用封装,所谓的'委托',用来定义包含类型的函数指针,可以用于实现回调。

    3. 使用匿名的代码块(lambda表达式),用以代替在别处定义的独立的回调函数。

    4. 在缺少函数类型的参数的面向对象的程序语言中,例如Java,回调可以用传递抽象类或接口来模拟。回调的接收者会调用抽象类或接口的方法,

    这些方法由调用者提供实现。这样的对象通常是一些回调函数的集合,同时可能包含它所需要的数据。这种方法在实现某些设计模式时比较有用,

    例如访问者模式,观察者模式与策略模式。

    二。Java回调实现

    public interface Fetcher {
        void fetchData(FetcherCallback callback);
    }
    
    public interface FetcherCallback {
        void onData(String receiveString);
        void onError(Throwable throwable);
    }
    
    public class FetcherImpl implements Fetcher {
    
        public Worker worker;
        
        public FetcherImpl(Worker worker){
            this.worker = worker;
        }
        
        @Override
        public void fetchData(final FetcherCallback callback) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    worker.execute(callback);
                }
            }).start();
        }
    
    }
    
    public class Worker {
        
        private String str = "";
        
        public void execute(FetcherCallback callback){
            try {
                init();
                callback.onData(str);
            } catch (IOException e) {
                callback.onError(e);
            }
        }
        
        private void init() throws IOException{
            File file = new File(".\Worker.java");
            FileInputStream fis = new FileInputStream(file);
            byte[] fileByte = new byte[(int) file.length()];
            fis.read(fileByte);
            str = new String(fileByte);
        }
    }

    在上面的代码中,我把回调函数放在其他线程上执行。

    进行测试:

    public class Test {
        public static void main(String[] args){
            Fetcher fetcher = new FetcherImpl(new Worker());
            fetcher.fetchData(new FetcherCallback() {
                @Override
                public void onError(Throwable throwable) {
                    System.out.println("account error : ------------ 
    " + throwable.getMessage());
                }
                
                @Override
                public void onData(String receiveString) {
                    System.out.println("receive String : -------------  
    " + receiveString );
                }
            });
        }
    }
  • 相关阅读:
    Java学习之集合(HashSet)
    Java学习之集合(LinkedList链表集合)
    Java学习之集合(List接口)
    Java学习之集合(Collection接口)
    【Spring Session】和 Redis 结合实现 Session 共享
    【NodeJS】nvm
    【Html JS】使用问题记录
    【VUE】使用问题记录
    【RabbitMQ】显示耗时处理进度
    【CentOS7】开发环境配置
  • 原文地址:https://www.cnblogs.com/yuyutianxia/p/4084266.html
Copyright © 2011-2022 走看看