2017-03-10 80 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 –

相关问题