• java 闭包与回调


    闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.

    内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象的引用,在此作用域内,内部类有权操作所有的成员,包括private成员

    回调的价值在于它的灵活性--可以运行时动态决定调用什么方法

    //: innerclasses/Callbacks.java
    // Using inner classes for callbacks
    package object;
    import static net.util.Print.*;
    
    interface Incrementable {
      void increment();
    }
    
    // Very simple to just implement the interface:
    class Callee1 implements Incrementable {
      private int i = 0;
      public void increment() {
        i++;
        print(i);
      }
    }    
    
    class MyIncrement {
      public void increment() { print("Other operation"); }
      static void f(MyIncrement mi) { mi.increment(); }
    }    
    
    // If your class must implement increment() in
    // some other way, you must use an inner class:
    class Callee2 extends MyIncrement {
      private int i = 0;
      public void increment() {
        super.increment();
        i++;
        print(i);
      }
      private class Closure implements Incrementable {
        public void increment() {
          // Specify outer-class method, otherwise
          // you'd get an infinite recursion:
          Callee2.this.increment();
        }
      }
      Incrementable getCallbackReference() {
        return new Closure();
      }
    }    
    
    class Caller {  
      private Incrementable callbackReference;
      Caller(Incrementable cbh) { callbackReference = cbh; }//Claller对象可以使用此引用回调Caller类
      void go() { callbackReference.increment(); }
    }
    
    public class Callbacks {
      public static void main(String[] args) {
        Callee1 c1 = new Callee1();
        Callee2 c2 = new Callee2();
        MyIncrement.f(c2);
        Caller caller1 = new Caller(c1);
        Caller caller2 = new Caller(c2.getCallbackReference());
        caller1.go();
        caller1.go();
        caller2.go();
        caller2.go();
      }    
    } /* Output:
    Other operation
    1
    1
    2
    Other operation
    2
    Other operation
    3
    *///:~
  • 相关阅读:
    windows C++ 网络编程
    typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针
    获取屏幕分辨率(C/C++)
    随手记
    【SQLite】可视化工具SQLite studio
    C++宽窄字符串转换
    并发编程1——一个简单的多线程程序
    css中:after和:before的作用及使用方法
    uniapp—App—自定义导航栏
    vue—封装无数据时默认展示组件
  • 原文地址:https://www.cnblogs.com/jiangfeilong/p/10236261.html
Copyright © 2020-2023  润新知