7

只是尝试动手操作java.lang.Record。我已经阅读了文档和JEP-359以获得一些理解。因此,在阅读了构造函数的隐式声明后,我想到了将它与现有的代码生成库 - Lombok 混合起来!

现在我最终创建的一个最小的可重现示例就是这条记录

import lombok.AllArgsConstructor;

@AllArgsConstructor
public record Java(String version) {
}

当使用 IntelliJ 编译成功生成类文件时,它看起来像

public final class Java extends java.lang.Record {
    private final java.lang.String version;
    public Java(java.lang.String version) { /* compiled code */ }
    ... rest of the compiled code
} 

请注意,.class文件的构造函数也正是我在这两个世界中独立所期望的。但是,在 IntelliJ 编译期间进一步尝试创建此记录的实例失败:

public class MixOfWorlds {

    public static void main(String[] args) {
        System.out.println(new Java("14").version()); // cannot resolve constructor
    }
}

我将创建一个更简单的示例来javac使用工具执行编译和执行java。如果这是由于我可能忽略的某些事情而可能发生的预期行为,我仍在寻找答案?

IntelliJ IDEA 2020.1 EAP (Community Edition)
Build #IC-201.6487.11, built on March 18, 2020 
Runtime version: 11.0.6+8-b765.15 x86_64 
macOS 10.14.6

这就是它在 IntelliJ 中反映的两种情况 - 有和没有@AllArgsConstructor.

截屏

4

1 回答 1

7

跟进这一点并在 IntelliJ 开发人员的在线帮助下,我尝试了以下步骤来解决这个问题——

  1. 我确信它看起来更像是javac-lombok交互并且没有连接到 IDE。
  2. 尽管突出显示了错误(看起来像编译时错误),但我实际上可以获得尝试运行代码的信心,并且它成功执行以按预期打印“14” 。
  3. 我可以确认禁用IDE中安装的“Lombok Plugin”后,突出显示的错误消失了。

在此处输入图像描述

注意:第二步是安装插件。所以简而言之,插件会突出显示代码,就好像它不会编译一样,但实际的执行是由 IntelliJ 正确处理的。(赞!)

编辑:随着版本的1.8.20发布,Lombok 可以防止 arecord再被注释AllArgsConstructor您可以在此处访问官方变更日志。

于 2020-03-23T02:05:18.783 回答