Lombok我们可以将@Builder和@Value一起用于单个类

时间:2015-08-13 15:19:45

标签: java lombok

首先感谢Lombok,我们的java代码现在更加流畅和清洁。 我的用例是我想创建一个不可变的类。为此我会使用@Value注释。另外我想使用构建器功能,因为我会使用@Builder注释。我的问题是,如果我们可以在一个类上同时使用@Builder和@Value。这是Lombok用户/开发人员推荐的好习惯。

3 个答案:

答案 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;

}

@Value type from eclipse

@Builder tyoe from eclipse