【问题标题】:Lombok @Data generates no empty constructor whith no final fieldsLombok @Data 不生成具有非最终字段的空构造函数
【发布时间】:2017-06-26 02:44:03
【问题描述】:

Lombok注解@RequiredArgsConstructor在不存在final字段时生成一个空的构造函数,这段代码编译没有错误:

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

根据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();
    }
}

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

这是 Lombok 中的错误吗?

【问题讨论】:

    标签: java constructor lombok


    【解决方案1】:

    我认为这不是 Lombok 中的真正错误。 如果将@Data 放在类上,则只有在您没有任何其他构造函数时才会生成空构造函数。

    在类上加上@AllArgsConstructor和@Data也是一样的:不会生成空的构造函数,因为会生成所有参数的构造函数。

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

    【讨论】:

    • 默认的空构造函数将由 Java 编译器生成,而不是由 Lombok 生成。 Lombok 文档指出:@Data is a convenient shortcut annotation that bundles the features of @ToString, @EqualsAndHashCode, @Getter / @Setter and @RequiredArgsConstructor together... 因此它应该始终生成一个RequiredArgsConstructor,在这种情况下它是一个空的构造函数。
    • 是的 emtpy 构造函数将由 Java 生成,但前提是您没有任何其他构造函数:lombok 坚持这一原则......
    • 这就是为什么我在这两种情况下都添加了一个显式构造函数,以便我们可以专注于 Lombok 行为。
    • 我没有任何其他构造函数,但它仍然抱怨 - its not public and cannot be accessed out the package。但是在添加@NoArgsConstructor 之后,错误就消失了。这有什么原因吗?
    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多