我有一个班级
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
中同时拥有两个构造函数?
答案 0 :(得分:24)
你的课程相当于:
@Accessors(chain = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Answer<T> {
private T data;
}
虽然严格来说,这会在所有变量上添加toString
,equals
和hashCode
方法。这可以(并且经常会)导致无限循环。对@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() {
}
}