Theo Tom Hawtin
Bao đóng là một khối mã có thể được tham chiếu (và truyền xung quanh) với quyền truy cập vào các biến của phạm vi bao quanh.
Bây giờ tôi đang cố gắng mô phỏng ví dụ đóng JavaScript trên Wikipedia , với bản dịch " straigth " sang Java, với hy vọng sẽ hữu ích:
//ECMAScript
var f, g;
function foo() {
var x = 0;
f = function() { return ++x; };
g = function() { return --x; };
x = 1;
print('inside foo, call to f(): ' + f()); // "2"
}
foo();
print('call to g(): ' + g()); // "1"
print('call to f(): ' + f()); // "2"
Bây giờ là phần java: Function1 là giao diện "Functor" với arity 1 (một đối số). Closure là lớp thực thi Function1, một Functor cụ thể hoạt động như một hàm (int -> int). Trong phương thức main (), tôi chỉ khởi tạo foo dưới dạng đối tượng Closure, sao chép các lệnh gọi từ ví dụ JavaScript. Lớp IntBox chỉ là một vùng chứa đơn giản, nó hoạt động giống như một mảng gồm 1 int:
int a [1] = {0}
interface Function1 {
public final IntBag value = new IntBag();
public int apply();
}
class Closure implements Function1 {
private IntBag x = value;
Function1 f;
Function1 g;
@Override
public int apply() {
// print('inside foo, call to f(): ' + f()); // "2"
// inside apply, call to f.apply()
System.out.println("inside foo, call to f.apply(): " + f.apply());
return 0;
}
public Closure() {
f = new Function1() {
@Override
public int apply() {
x.add(1);
return x.get();
}
};
g = new Function1() {
@Override
public int apply() {
x.add(-1);
return x.get();
}
};
// x = 1;
x.set(1);
}
}
public class ClosureTest {
public static void main(String[] args) {
// foo()
Closure foo = new Closure();
foo.apply();
// print('call to g(): ' + g()); // "1"
System.out.println("call to foo.g.apply(): " + foo.g.apply());
// print('call to f(): ' + f()); // "2"
System.out.println("call to foo.f.apply(): " + foo.f.apply());
}
}
Nó in:
inside foo, call to f.apply(): 2
call to foo.g.apply(): 1
call to foo.f.apply(): 2