首先感谢Lombok,我们的java代码现在更加流畅和清洁。 我的用例是我想创建一个不可变的类。为此我会使用@Value注释。另外我想使用构建器功能,因为我会使用@Builder注释。我的问题是,如果我们可以在一个类上同时使用@Builder和@Value。这是Lombok用户/开发人员推荐的好习惯。
答案 0 :(得分:8)
当然可以。要检查,只需delombok您的代码并查看其生成的内容。举个例子:
$ ./print_tree.sh "F1 L1"
awk -F, '$2=="F1 L1" {print $1}' /var/tmp/hier
awk: syntax error near line 1
awk: bailing out near line 1
在去骨化后,这会产生:
$ awk -F, '$2=="F1 L1" {print $1}' /var/tmp/hier
F2 L2
F3 L3
因此,您可以清楚地同时使用@Builder
@Value
public class Pair {
private Object left;
private Object right;
}
和public class Pair {
private Object left;
private Object right;
@java.beans.ConstructorProperties({ "left", "right" })
Pair(Object left, Object right) {
this.left = left;
this.right = right;
}
public static PairBuilder builder() {
return new PairBuilder();
}
public Object getLeft() {
return this.left;
}
public Object getRight() {
return this.right;
}
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Pair)) return false;
final Pair other = (Pair) o;
final Object this$left = this.left;
final Object other$left = other.left;
if (this$left == null ? other$left != null : !this$left.equals(other$left)) return false;
final Object this$right = this.right;
final Object other$right = other.right;
if (this$right == null ? other$right != null : !this$right.equals(other$right)) return false;
return true;
}
public int hashCode() {
final int PRIME = 59;
int result = 1;
final Object $left = this.left;
result = result * PRIME + ($left == null ? 0 : $left.hashCode());
final Object $right = this.right;
result = result * PRIME + ($right == null ? 0 : $right.hashCode());
return result;
}
public String toString() {
return "Pair(left=" + this.left + ", right=" + this.right + ")";
}
public static class PairBuilder {
private Object left;
private Object right;
PairBuilder() {
}
public Pair.PairBuilder left(Object left) {
this.left = left;
return this;
}
public Pair.PairBuilder right(Object right) {
this.right = right;
return this;
}
public Pair build() {
return new Pair(left, right);
}
public String toString() {
return "Pair.PairBuilder(left=" + this.left + ", right=" + this.right + ")";
}
}
}
答案 1 :(得分:6)
从版本1.16.10开始,当您同时使用两者时,构造函数不公开。
您可以添加@AllArgsConstructor来弥补这一点。
答案 2 :(得分:0)
简短回答:是的,您始终可以同时使用@Value和@Builder。我已经在生产代码中使用了它,并且效果很好。
长答案:您可以一起使用它们。您要记住的一件事是,自lombok v1.16.0起,@ Value提供的AllArgsConstructor将是私有的。因此,如果您希望将其公开,则必须另外通过@AllArgsConstructor访问该控件。但就我而言,私有构造函数是我真正想要的。我使用@Builder的目的是真正只允许使用生成器实例化对象,而以后不使用构造函数或setter方法。
这是我的代码:
@Value
@Builder
@ApiModel(description = "Model to represent annotation")
public class Annotation {
@NonNull
@ApiModelProperty(value = "Unique identifier")
private String id;
}