龙目岛各种建造者的注释?

时间:2014-09-12 13:12:24

标签: java lombok

我有一个班级

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中同时拥有两个构造函数?

4 个答案:

答案 0 :(得分:24)

你的课程相当于:

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

答案 1 :(得分:10)

你试过这个吗?

@NoArgsConstructor
@AllArgsConstructor

答案 2 :(得分:0)

尝试一下。这应该工作。还要添加此注释。

  

@NoArgsConstructor

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

答案 3 :(得分:0)

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

@NoArgsConstructor
@AllArgsConstructor

@AllArgsConstructor 生成一个构造函数,该构造函数要求带注释的类中的每个字段都有一个参数。

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

@AllArgsConstructor
public class Employee {

    private String name;
    private int salary;
}

当我们取消班级分组时,它变为:

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