使用内部类实现回调过程的呈现如下代码。回调在java GUI的设计中处处皆是。
另外重复一条容易被忽视的设计规则,在子类继承父类,并对父类的方法进行重写时,不能降低父类方法的访问权限,可以扩大(当然,这样毫无意义),但是不能缩小,这是出于子类不能改变父类成员属性的考虑。例如,如果父类的方法访问权限是public,那么子类覆盖后的该方法访问权限就不能是protected或者private。
代码:
package test;
interface Increment{
void increment();
}
class MyIncrement{
public void increment(){
System.out.println("Other operation");
}
static void f(MyIncrement mi){
mi.increment();
}
}
class Caller extends MyIncrement{
private int i=0;
public void increment(){
super.increment();
i++;
System.out.println(i);
}
private class Closure implements Increment{
@Override
public void increment() {
// TODO Auto-generated method stub
Caller.this.increment();
}
}
Increment getCallbackReference(){
return new Closure();
}
}
class Caller2{
private Increment callbackReference;
Caller2(Increment callbackReference){
this.callbackReference=callbackReference;
}
void go(){
callbackReference.increment();
}
}
public class p206 {
public static void main(String args[]){
Caller callera=new Caller();
Caller2 callerb=new Caller2(callera.getCallbackReference());
callerb.go();
}
}
其中的Closure其实就是用来提供回调功能的内部类。相比于西加加用指针来实现回调来说,java这种方式更加的安全,不会因为指针的错误操作导致出错。可以看出,Closure是private的,只能通过getCallbackReference函数来获得,这样就比较安全。