【问题标题】:How does Lombok.val actually work?Lombok.val 实际上是如何工作的?
【发布时间】:2017-07-31 18:50:29
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java annotations lombok


    【解决方案1】:

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

    虽然 Lombok 使用注解和注解处理器,但注解处理器仅用作让编译器参与其中的一种手段。

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

    对于实际替换,对于 Eclipse/ecj,请参阅 this classthis one。对于 javac,请参阅this class

    披露:我是 Lombok 开发人员。

    【讨论】:

    • 我知道 lombok.val 应该在局部变量中 - 方法局部变量。为什么它不能在类和实例级别工作。我真的很喜欢通过 lombok 为 java 引入的类型推断来实现类似 scala 的约定——就像在 'val' 和 'var' 中一样
    • 这没有解释(至少对我而言)是val example = new ArrayList&lt;String&gt;() 不会因error: incompatible types: ArrayList cannot be converted to val 而失败(这是我所期望的,因为 val 没有被声明为 @ 的超类型987654329@)。但据我所知,这是因为在 lombok 启动时,AST 已经被解析但还没有进行编译,即只检查了语法,没有检查逻辑。
    猜你喜欢
    • 2021-01-21
    • 2011-09-27
    • 2021-12-16
    • 2013-03-14
    • 2021-03-23
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多