【问题标题】:Annotation for various constructors in Lombok?Lombok中各种构造函数的注释?
【发布时间】:2014-09-12 13:12:23
【问题描述】:

我有课

public class Answer<T> {
    private T data;

    public Answer(T data) {
        this.data = data;
    }

    public Answer() {
    }

    public T getData() {
        return data;
    }

    public Answer<T> setData(T data) {
        this.data = data;
        return this;
    }
}

我想用Lombok 来简化它。

如果我添加注解@AllArgsConstructor,我就看不到默认构造函数。

@Data
@AllArgsConstructor
public class Answer<T> {
    private T data;

    public Answer<T> setData(T data) {
        this.data = data;
        return this;
    }
}

Lombok 中是否可以同时拥有两个构造函数?

【问题讨论】:

    标签: java lombok


    【解决方案1】:

    你的类相当于:

    @Accessors(chain = true)
    @Data    
    @NoArgsConstructor
    @AllArgsConstructor
    public class Answer<T> {
    
        private T data;
    }
    

    虽然严格来说,这会在 所有 变量上添加 toStringequalshashCode 方法。这会(并且经常会)导致无限循环。警惕@Data

    @Accessors(chain = true) 使setter 实现返回this,更多信息here

    可以添加多个构造函数注解:

    与大多数其他 lombok 注释不同,显式构造函数的存在不会阻止这些注释生成自己的构造函数。

    请注意,@Accessors 是实验性的,因此将来可能会更改/重命名。

    我更喜欢@Builder 而不是@AllArgsConstructor,因为它只允许设置必需的 参数,而全参数构造函数是全有或全无。它还会生成更具可读性的代码,请考虑

    new Thing(true, 1, 4, false, 4, 4.0)
    

    对比

    new Thing.Builder().
        setANamnedProperty(true).
        setAnotherNamnedProperty(1).
        ....
        build();
    

    【讨论】:

    • 我会半弃用 @Accessors 以支持 configuration。关于构造函数,我宁愿只使用@RequiredArgsConstructor。结合Guice,意思就是我只要声明一个字段就可以使用(代码中没有构造函数调用)。
    • 不知道配置 - 这是一个闪亮的新事物。感谢您的提示。
    【解决方案2】:

    你试过了吗?

    @NoArgsConstructor
    @AllArgsConstructor
    

    【讨论】:

    • 出于某种原因,在我的情况下,这只会创建第一个构造函数(无参数),而忽略第二个构造函数。如果我翻转订单,问题也会翻转......
    【解决方案3】:

    是的,你可以在 Lombok 中使用这两个构造函数。

    @NoArgsConstructor
    @AllArgsConstructor
    

    @AllArgsConstructor 生成一个构造函数,该构造函数需要为带注释的类中的每个字段提供一个参数。

    所以我们有包含两个字段的 Employee 类:

    @AllArgsConstructor
    public class Employee {
    
        private String name;
        private int salary;
    }
    

    当我们对类进行 de-lombok 时,它变成:

    public class Employee {
    
        private String name;
        private int salary;
    
        public Employee(String name, int salary) {
            this.name = name;
            this.salary = salary;
        }
    }
    

    @NoArgsConstructor 生成一个没有参数的默认构造函数。

    我们有以下 Employee 类:

    @NoArgsConstructor   
    public class Employee {
    
        private String name;
        private int salary;
    }
    

    当我们查看生成的代码时,我们看到 Lombok 添加了一个无参数构造函数:

    public class Employee {
    
        private String name;
        private int salary;
    
        public Employee() {
        }
    }
    

    More examples

    【讨论】:

      【解决方案4】:

      试试这个。这应该有效。也添加此注释。

      @NoArgsConstructor

      @NoArgsConstructor 将生成一个没有参数的构造函数。如果这是不可能的(因为 final 字段),则会导致编译器错误,除非使用 @NoArgsConstructor(force = true),否则所有 final 字段都将初始化为 0 / false / null。对于具有约束的字段,例如@NonNull 字段,不会生成检查,因此请注意,这些约束通常不会在以后正确初始化这些字段之前得到满足。某些 java 构造,例如 hibernate 和服务提供者接口需要一个无参数构造函数。此注解主要与 @Data 或生成注解的其他构造函数之一结合使用。

      【讨论】:

        猜你喜欢
        • 2019-10-16
        • 2017-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多