閉包(Closure)是一種能被呼叫的物件,它儲存了建立它的作用域的資訊
public class Programmer {
private String name; public Programmer() {
super();
} public Programmer(String name) {
super();
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public void work() {
System.out.println(name + "正在程式設計");
}
}
public interface Teachable {
public void work();
}
public class TeachableProgrammer extends Programmer { public TeachableProgrammer() {
super();
} public TeachableProgrammer(String name) {
super(name);
} // 教學工作任然由TeachableProgrammer定義
private void teach(String content) {
System.out.println(getName() + "正在教授"+content);
} private class Closure implements Teachable {
String content = ""; Closure (String content){
this.content = content;
}
@Override
public void work() {
// 非靜態內部類實現Teachable的work方法,作用僅僅是向客戶類提供一個回撥外部類的途徑
teach(content);
}
} // 返回一個非靜態內部類的引用,允許外部類通過該引用來回調外部類的方法
public Teachable getCallbackReference(String content) {
return new Closure(content);
}
}
public class TestClosure { public static void main(String[] args) {
TeachableProgrammer tp = new TeachableProgrammer("李剛");// 該示例來源於李剛老師的瘋狂講義
// 直接呼叫TeachableProgrammer從Programmer類繼承下來的work方法
tp.work();
// 表明上看是呼叫的Closure的work方法,實際上是通過通過work方法回撥TeachableProgrammer的teach方法
tp.getCallbackReference("數學").work(); } }