Lombok.val 是如何运作的?

How does Lombok.val actually work?

Lombok.val 让你

use val as the type of a local variable declaration instead of actually writing the type. When you do this, the type will be inferred from the initializer expression. The local variable will also be made final.

所以

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");
    }
}

如果这些用法不是注释,而是注释 types,Lombok 如何处理这些用法?根据我(显然不正确)的理解,语法应该更像:

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

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

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

尽管 Lombok 使用注解和注解处理器,但注解处理器仅用作编译器参与的一种手段。

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

对于 Eclipse/ecj 的实际替换,请参见 this class and this one. For javac, see this class

披露:我是 Lombok 开发人员。