2017-03-10 79 views
6

Lombok.val讓你Lombok.val實際上是如何工作的?

使用VAL作爲一個局部變量聲明的實際編寫類型的類型,而不是 。當你這樣做時,類型將從初始化表達式中推斷出來。局部變量也將作出最終決定。

所以不是

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

你可以寫

val example = new ArrayList<String>(); 

我試着做一些研究到這實際上是如何工作的,但似乎並沒有被大量的信息。看看the github page,我可以看到val是一個註釋類型。然後使用註釋類型,而不是實際的註釋。

我甚至不知道你甚至可以用這種方式使用註釋類型,但是在測試它時,下面的代碼確實是有效的。但是,我仍然不確定爲什麼你會想要以這種方式使用該類型。

public class Main 
{ 
    public @interface Foo { } 

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

如何龍目島過程中,這些用法,如果他們不註釋,但註釋類型?我的(顯然是不正確)的理解,語法應該更像:

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

(我知道的約束標註的意義上是無效的語法)

回答

14

爲了讓龍目島工作,源代碼需要解析沒有錯誤。正因如此,正如你所提到的,@val foo = new ArrayList<String>();不起作用。

儘管Lombok使用註釋和註釋處理器,但註釋處理器僅用作編譯器參與的手段。

龍目島沒有註冊處理器@val。相反,它處理所有java文件,訪問整個AST並用本地變量的初始化表達式的類型替換val

披露:我是一名龍目島開發人員。

+0

謝謝!並感謝一個偉大的圖書館。你能把我指向github的哪個地方做替換嗎?我很感興趣。 – Michael

+1

對於Eclipse和ecj,請參閱https://github.com/rzwitserloot/lombok/blob/master/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java和https://github.com/rzwitserloot/lombok/blob /master/src/eclipseAgent/lombok/eclipse/agent/PatchValEclipse.java,對於javac,請參閱https://github.com/rzwitserloot/lombok/blob/master/src/core/lombok/javac/handlers/HandleVal.java –

相關問題