2017-03-10 26 views
6

Lombok.val cho phép bạnLombok.val thực sự hoạt động như thế nào?

val sử dụng như các loại của một khai báo biến cục bộ thay vì thực sự bằng văn bản các loại. Khi bạn làm điều này, loại sẽ được suy ra từ biểu thức khởi tạo. Biến cục bộ cũng sẽ được thực hiện cuối cùng.

Vì vậy, thay vì

final ArrayList<String> example = new ArrayList<String>(); 

Bạn có thể viết

val example = new ArrayList<String>(); 

Tôi đã cố gắng để làm một số nghiên cứu về cách thức này thực sự hoạt động nhưng có vẻ không phải là một lượng thông tin khổng lồ. Nhìn vào the github page, tôi có thể thấy rằng val là một loại chú thích. Chú thích loại sau đó được sử dụng thay vì chú thích thực tế.

Tôi thậm chí không biết bạn thậm chí có thể sử dụng các loại chú thích theo cách này nhưng khi kiểm tra nó, mã sau đây thực sự là hợp lệ. Tuy nhiên, tôi vẫn không chắc tại sao bạn lại muốn sử dụng kiểu này theo cách này.

public class Main 
{ 
    public @interface Foo { } 

    public static void main(String... args) 
    {  
     Foo bar; 
     System.out.println("End"); 
    } 
} 

Làm thế nào để quá trình Lombok những tập quán nếu họ không chú thích, nhưng chú thích loại? Để (rõ ràng là không chính xác) tôi hiểu, cú pháp sẽ giống như hơn:

@Val foo = new ArrayList<String>(); 

(Tôi hạn chế nhận thức chú thích có nghĩa là trên không phải là cú pháp hợp lệ)

Trả lời

14

Để Lombok để làm việc, mã nguồn cần phân tích cú pháp mà không có lỗi. Đó là lý do tại sao, như bạn đã đề cập, @val foo = new ArrayList<String>(); sẽ không hoạt động.

Mặc dù Lombok sử dụng chú thích và bộ xử lý chú thích, bộ xử lý chú thích chỉ được sử dụng làm phương tiện để trình biên dịch tham gia.

Lombok không có bộ xử lý đã đăng ký cho @val. Thay vào đó, nó xử lý tất cả các tệp java, truy cập toàn bộ AST và thay thế val theo loại biểu thức khởi tạo của các biến cục bộ.

Tiết lộ: Tôi là nhà phát triển Lombok.

+0

Cảm ơn! Và cảm ơn vì một thư viện tuyệt vời. Bạn có thể chỉ cho tôi đến nơi trong github mà không thay thế? Tôi quan tâm. – Michael

+1

Đối với Eclipse và ecj, hãy xem https://github.com/rzwitserloot/lombok/blob/master/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java và https://github.com/rzwitserloot/lombok/blob /master/src/eclipseAgent/lombok/eclipse/agent/PatchValEclipse.java, cho javac, xem https://github.com/rzwitserloot/lombok/blob/master/src/core/lombok/javac/handlers/HandleVal.java –

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