Lombok.val如何实际工作?

时间:2017-03-10 12:12:44

标签: java annotations lombok

Lombok.val允许你

  

使用val作为局部变量声明的类型而不是   实际上写的类型。执行此操作时,将从初始化表达式推断出类型。本地变量也将成为最终变量。

所以而不是

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

你可以写

val example = new ArrayList<String>();

我试图对其实际效果进行一些研究,但似乎没有大量的信息。查看the github page,我可以看到val是注释类型。然后使用注释 type ,而不是实际注释。

我甚至不知道你甚至可以用这种方式使用注释类型,但在测试它时,下面的代码确实有效。但是,我仍然不确定为什么你会想要以这种方式使用该类型。

public class Main
{
    public @interface Foo { }

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

如果Lombok不是注释,而是注释 types ,它们如何处理这些用法?对于我(显然不正确)的理解,语法看起来应该更像:

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

(我知道注释的约束意味着上面的语法无效)

1 个答案:

答案 0 :(得分:26)

为了让Lombok工作,源代码需要解析而不会出错。这就是为什么,正如您已经提到的那样,@val foo = new ArrayList<String>();将不起作用。

虽然Lombok使用注释和注释处理器,但注释处理器仅用作编译器参与的手段。

Lombok没有@val的注册处理器。相反,它处理所有java文件,访问整个AST并用局部变量的初始化表达式的类型替换val

披露:我是龙目岛的开发者。