Lombok.val实际上是如何运作的?

2022-09-01 22:44:15

龙目岛

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

所以不是

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

你可以写

val example = new ArrayList<String>();

我试图对此进行一些研究,以了解其实际工作原理,但似乎没有大量信息。查看github页面,我可以看到这是一种注释类型。然后使用批注类型,而不是实际的批注。val

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

public class Main
{
    public @interface Foo { }

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

如果龙目岛不是注释,而是注释类型,如何处理这些用法?根据我(显然不正确)的理解,语法应该看起来更像:

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

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


答案 1

为了使龙目岛正常工作,源代码需要解析而不会出现错误。这就是为什么,正如你已经提到的,行不通。@val foo = new ArrayList<String>();

虽然龙目岛使用注释和注释处理器,但注释处理器仅用作编译器参与的一种手段。

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

对于实际的替换,对于 Eclipse/ecj,请参阅此类此类。对于 javac,请参阅此类

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


答案 2

推荐