2009-10-23 37 views
6

Lamdbaj cho phép định nghĩa của việc đóng cửa bằng ngôn ngữ Java, ví dụ khác nhau có thể được tìm thấy herecơ chế Java tại sử dụng trong đóng cửa lambdaj

Câu hỏi của tôi là liên quan đến các cơ chế Java cơ bản tại sử dụng, ví dụ, để xác định println đóng cửa, các mã sau đây được sử dụng:

Closure println = closure(); 
{ of(System.out).println(var(String.class)); } 

đóng cửa này có thể được thực hiện sau đó qua:

println.apply("foobar"); 

Tôi tò mò muốn biết cơ chế nào trong Java sẽ cho phép gọi tới số of(...).println(...) để liên kết với chính cá thể println.

Đương nhiên, mã nguồn lambdaj có sẵn để đọc nhưng tôi đã hy vọng cho một lời giải thích mức cao hơn một chút nếu có ai có. Kỹ năng phản chiếu của tôi đi xa như một chút của nội tâm và thực hiện các phương pháp năng động.

+0

Tôi có thiếu "đóng cửa" bit? Tôi thấy một phương pháp được dỡ bỏ, nhưng đó là nó. : -/ –

+1

Thực ra, Lambdaj không hỗ trợ đóng cửa. Cụ thể, nó không thể nắm bắt các biến từ phạm vi kèm theo. –

Trả lời

2

Vâng, of có lẽ là phương thức static được nhập tĩnh để có thể được gọi mà không có tên lớp kèm theo. Tôi hy vọng rằng var là như nhau. Cả hai phương pháp phải trả lại một số loại mà có những phương pháp sau đó được gọi là:

public class Printable { 
    public void println(Var var); 
} 

public class Fac { 
    public static Printable of(Object o) { 
    return new Printable(o); 
    } 

    public static Var var(Class<?> clazz) { 
    return new Var(clazz); 
    } 

} 

Đột nhiên:

Fac.of(System.out).println(Fac.var(String.class)); 

là hợp lệ Java. Sử dụng nhập khẩu tĩnh, hey mau:

import static Fac.*; 

of(System.out).println(var(String.class)); 

Các xoăn-niềng răng là rõ ràng là hợp lệ Java như bạn có thể thêm các phương pháp trong bất kỳ để hỗ trợ trong việc xác định một sope từ vựng. Kiểu thiết kế API này được gọi là fluent và được thể hiện tốt nhất bằng thư viện kiểm tra JMock.

Nhân tiện, nếu điều này là nghĩa vụ phải giới thiệu bao đóng cho Java, nó khá vô lý - cú pháp là không thể đọc được khủng khiếp. Ví dụ I/O của họ thực sự khiến tôi cười to. Hãy thử Scala!

EDIT - hai cuộc gọi println được kết hợp Tôi tin rằng vì chuỗi đầu tiên của cuộc gọi cho phép thư viện nắm bắt các biến mà bạn đã chuyển vào làm tham số. Đây có thể được chụp ở một số cấu trúc ThreadLocal. Khi bạn gọi phương thức println (cũng có thể là tĩnh), thư viện đang sử dụng dữ liệu đã thu thập này để thực thi hành vi này sau này. Cũng thử nghiệm liên quan, khung kiểm tra EasyMock sử dụng một cơ chế tương tự (sử dụng các proxy Java trong nền) để nắm bắt các giá trị mong đợi.

+3

+1. Sau 3 năm của C + + tôi nghĩ rằng tôi biết về đóng cửa xấu xí, nhưng * Thiên Chúa toàn năng * ... –

+0

Cảm ơn, tôi đã thực sự chuyển sang Scala cho hầu hết các hoạt động phát triển của tôi bây giờ. Điều này vẫn còn khiến tôi bối rối, tôi hiểu được phần tử nhập tĩnh, sự bối rối của tôi là cách gọi hàm (...). Println (...) bằng cách nào đó liên kết với cá thể 'println' được định nghĩa trước nó, trong ví dụ mở đầu của tôi . –

+0

OK - Tôi đã chỉnh sửa câu trả lời của mình vì tôi nghĩ rằng tôi biết điều này có thể xảy ra như thế nào –

10

Tôi là Mario Fusco và tôi là nhà phát triển chính của thư viện lambdaj.

Trước hết tôi muốn làm rõ điều gì đó: lambdaj không nhằm thay thế bất kỳ ngôn ngữ chức năng nào. Như tôi đã nói tuần trước trong bài phát biểu của tôi tại Jug of Zurich nếu bạn có cơ hội sử dụng Scala, hãy tìm nó và không bao giờ nhìn lại.Ở đây bạn có thể tìm thấy một sơ yếu lý lịch của bài phát biểu của tôi, nơi nó được tuyên bố rõ ràng rằng:

http://ctpjava.blogspot.com/2009/10/lambdaj-new-trends-in-java.html

Tôi là một nhà phát triển Scala hạnh phúc quá. Nhưng đôi khi bạn chỉ có nghĩa vụ phát triển trong Java (theo kinh nghiệm của tôi, trong thế giới thực, khoảng 80% thời gian bạn không thể chọn ngôn ngữ bạn phải viết mã) và trong trường hợp này một số tính năng lambdaj có thể hữu ích (hoặc tôi hy vọng như vậy). Tôi chỉ muốn mang đến cho Java một số tính năng chức năng hoàn toàn bị thiếu. Tất nhiên kết quả là không hoàn toàn đáp ứng chủ yếu là do giới hạn áp đặt bởi Java chính nó.

Đối với cơ chế lambdaj nội bộ, có nó sử dụng một ThreadLocal để đạt được kết quả đó. Nếu bạn có thắc mắc khác, sự tò mò hoặc gợi ý tốt hơn và các nhà phê bình mang tính xây dựng về lambdaj có lẽ bạn có thể quan tâm đến đăng ký cho mình với lambdaj gửi thư danh sách ở đây:

http://groups.google.com/group/lambdaj

Bye Mario

Các vấn đề liên quan