Lombok @Data 不会生成没有最终字段的空构造函数

bal*_*age 6 java constructor lombok

@RequiredArgsConstructor当不存在最终字段时,Lombok 注释会生成一个空构造函数,此代码编译时不会出现错误:

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class LombokTest {

    public LombokTest(String a) {
        // to avoid creation of the default constructor by the Java compiler
    }

    public static void main(String[] args) {
        new LombokTest();
    }
}
Run Code Online (Sandbox Code Playgroud)

根据Lombok文档,注释@Data还应该生成一个RequiredArgsConstructor,但是在以下代码中

import lombok.Data;

@Data
public class LombokTest {

    public LombokTest(String a) {
        // to avoid creation of the default constructor by the Java compiler
    }

    public static void main(String[] args) {
        new LombokTest();
    }
}
Run Code Online (Sandbox Code Playgroud)

main 方法中的 new LombokTest() 会导致错误,因为无参数构造函数未定义。

这是龙目岛的一个错误吗?

小智 4

我认为这并不是龙目岛的一个真正的错误。如果将 @Data 放在类上,则仅当您没有任何其他构造函数时才会生成空构造函数。

如果将 @AllArgsConstructor 和 @Data 放在类上,效果是一样的:不会生成空构造函数,因为将生成带有所有参数的构造函数。

您可以添加@NoArgsConstructor来生成空构造函数。

  • 默认的空构造函数将由 Java 编译器生成,而不是由 Lombok 生成。Lombok 文档指出:“@Data 是一个方便的快捷注释,它将 @ToString、@EqualsAndHashCode、@Getter / @Setter 和 @RequiredArgsConstructor 的功能捆绑在一起......”因此它应该始终生成一个 requiredArgsConstructor,它是一个空构造函数在这种情况下。 (2认同)