Đóng trong Java 7 [đã đóng]


105

Đóng cửa là gì? Nó được cho là sẽ được đưa vào Java 7. (Closures đã được thảo luận để đưa vào Java 7, nhưng cuối cùng lại không được đưa vào. -Ed) Mọi người có thể vui lòng cung cấp cho tôi một số tài liệu tham khảo đáng tin cậy để tôi có thể tìm hiểu những thứ về bao đóng không?

Câu trả lời:


59

Đây là blog của Neal Gafter, một trong những người tiên phong giới thiệu các bao đóng trong Java. Bài đăng của anh ấy về việc đóng cửa từ ngày 28 tháng 1 năm 2007 có tên là Định nghĩa về sự đóng cửa Trên blog của anh ấy có rất nhiều thông tin để giúp bạn bắt đầu cũng như video. Đây là một bài nói chuyện tuyệt vời của Google - Các chủ đề nâng cao về ngôn ngữ lập trình - Đóng cửa cho Java với Neal Gafter.


2
Bạn có liên kết cụ thể hơn blog tổng thể không?
I82Nhiều


1
Nếu có ai bị câm như tôi và nếu bạn đang đập đầu vào tường chỉ để biết
Clos

tôi không thể tưởng tượng thực hiện đóng cửa trong một ngôn ngữ mà didnt ban đầu có them..kinda điên
Alexander Mills

Alexander Mills chỉ tò mò .. tại sao?
Bartzilla

84

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.

Kể từ Java 1.1, lớp bên trong ẩn danh đã cung cấp cơ sở này một cách dài dòng. Họ cũng có một hạn chế là chỉ có thể sử dụng final(và chắc chắn được gán) các biến cục bộ. (Lưu ý, ngay cả các finalbiến không cục bộ cũng nằm trong phạm vi, nhưng không thể được sử dụng.)

Java SE 8 được thiết kế để có một phiên bản ngắn gọn hơn của điều này cho các giao diện đơn phương thức *, được gọi là "lambdas". Lambdas có nhiều hạn chế giống như các lớp bên trong ẩn danh, mặc dù một số chi tiết thay đổi ngẫu nhiên.

Lambdas đang được phát triển theo Dự án LambdaJSR 335 .

* Ban đầu thiết kế linh hoạt hơn cho phép các loại Phương pháp Tóm tắt Đơn (SAM). Thật không may, thiết kế mới kém linh hoạt hơn, nhưng cố gắng biện minh cho việc cho phép triển khai trong các giao diện.


7

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 

2
IMO bên cạnh tên này không có gì để làm với đóng cửa
n00b


4

Java Closures sẽ là một phần của J2SE 8 và được phát hành vào cuối năm 2012.

Hỗ trợ bao đóng của Java 8 bao gồm khái niệm về Biểu thức Lambda, Tham chiếu phương thức, Tham chiếu hàm tạo và các Phương thức mặc định.

Để biết thêm thông tin và các ví dụ hoạt động cho việc này, vui lòng truy cập: http://amitrp.blogspot.in/2012/08/at-first-sight-with-closures-in-java.html


1
Hmm, tuy nhiên Java 8 không cho phép sửa đổi biến đóng. Bài báo hay.
nawfal


0

Triển khai đóng cho Java 5, 6 và 7

http://mseifed.blogspot.se/2012/09/bringing-closures-to-java-5-6-and-7.html

Nó chứa tất cả những gì người ta có thể yêu cầu ...


Liên kết chuyển đến một số văn bản mô tả nó nhưng mã được liên kết đến từ trang đó không tồn tại. Thực hiện ở đâu?
Jerry Jeremiah

@JerryJeremiah Đây rồi, bây giờ nó có tên khác, tất cả các phiên bản ban đầu đều không có ở đó (để hỗ trợ quyền truy cập không cuối cùng và hơn thế nữa thông qua các lớp trừu tượng, nó có thể được thêm lại cho các phiên bản <Java 8, bạn là nền tảng nào tìm kiếm): bitbucket.org/momomo/opensource/src
mmm

2
Liên kết đang bị phá vỡ!
sunleo

Tôi có một liên kết 404 đã chết
Alexander Mills

liên kết bị hỏng (đây là lý do tại sao chúng ta không nên đặt liên kết làm câu trả lời ...)
OhadR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.