今天和大家一起来学习闭包与回调。
在此之前,先来看一个场景:目前有一个 Incrementable 接口待实现。
public interface Incrementable {
void increment();
}
最直接的方式通过 implements 实现 Incrementable 接口。
public class Callee1 implements Incrementable {
private int i = 0;
@Override
public void increment() {
i++;
System.out.println(i);
}
}
但有一种较为尴尬的情况就是,假设在继承的类中已经拥有同名的 increment() 方法,此时若还想实现 Incrementable 接口中的 increment() 势必会覆盖基类中的同名方法。
倘若想保证基类和接口中的同名方法都生效,可以使用内部类解决这个问题。
public class MyIncrement {
public void increment() {
System.out.println("Other increment");
}
}
public class Callee2 extends MyIncrement {
private int i = 0;
public void incrementCallee2() {
i++;
System.out.println(i);
}
private class Closure implements Incrementable {
@Override
public void increment() {
incrementCallee2();
}
}
Incrementable getCallbackReference() {
return new Closure();
}
}
public class Callbacks {
public static void main(String[] args) {
Callee2 callee2 = new Callee2();
callee2.increment();
callee2.getCallbackReference().increment();
}
}
Other increment
1
通过定义内部类实现 Incrementable 接口,再通过外围类返回内部类 Closure 的引用,从而实现 Incrementable 接口中的方法, MyIncrement 类中的同名方法也得以保留。
在这里需要注意的是,getCallbackReferenc() 方法返回的是 Incrementable 的引用,而非 Closure ,这是一种安全的做法,使得调用方只能使用 Incrementable 中的方法,不能调用 Closure 的其他方法。
内部类 Closure 是一个可调用的对象,并且包含外围类 Callee2 的所有信息(哪怕是 private 成员),Closure 可理解为 Callee2 的闭包;内部类 Closure 在 increment() 方法中调用 外围类Callee2 的 incrementCallee2() 方法,这被称为回调。
内部类 Closure 并没有改变外围类的接口,却拓展了类的功能,使用闭包与回调可以增加程序的灵活性与拓展性。
至本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。
若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!