Java Lombok我们可以在单个类中同时使用@Builder和@Value吗

Java Lombok我们可以在单个类中同时使用@Builder和@Value吗,java,lombok,Java,Lombok,首先多亏了Lombok,我们的java代码现在变得更加流畅和干净。 我的用例是我想创建一个不可变的类。为此,我将使用@Value注释。我还想使用生成器功能,因为我会使用@builder注释。我的问题是,我们是否可以在一个类中同时使用@Builder和@Value。这是Lombok用户/开发人员推荐的良好实践吗 当然可以。要进行检查,只需编写代码并查看它生成了什么。举个例子: @Builder @Value public class Pair { private Object left;

首先多亏了Lombok,我们的java代码现在变得更加流畅和干净。
我的用例是我想创建一个不可变的类。为此,我将使用@Value注释。我还想使用生成器功能,因为我会使用@builder注释。我的问题是,我们是否可以在一个类中同时使用@Builder和@Value。这是Lombok用户/开发人员推荐的良好实践吗

当然可以。要进行检查,只需编写代码并查看它生成了什么。举个例子:

@Builder
@Value
public class Pair {
    private Object left;
    private Object right;
}
脱MBO后,会产生:

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.16.10版开始,您可以清楚地同时使用
@Value
@Builder

,当您同时使用两者时,构造函数不是公共的


您可以添加@allargsconstuctor来弥补这一不足。

简短回答:是的,您可以始终同时使用@Value和@Builder。我已经在我的生产代码中使用了它,它工作得很好

长回答:你可以一起使用它们。您需要记住的一点是,@Value提供的AllArgsConstructor将是自lombok v1.16.0以来包的私有。因此,如果您希望它是公共的,那么您必须另外通过@allargsconstuctor访问该控件。在我的例子中,私有构造函数是我真正想要的。我使用@Builder的目的是真正允许只使用Builder进行对象实例化,而不在以后使用构造函数或setter方法

这是我的密码:


@Value
@Builder
@ApiModel(description = "Model to represent annotation")
public class Annotation {

    @NonNull
    @ApiModelProperty(value = "Unique identifier")
    private String id;

}


HI@BranislavLazic,是的,我试过了。我的问题是,其他人是否也遇到过这个用例,这是推荐的做法。是的,如果同时使用
@Value
@Builder
,构造函数将成为包私有的。顺便说一下,通过从各个字段中省略
private
access修饰符,您可以编写更少的代码,因为正如Lombok的注释文档中所述-“…字段默认为
private
final
。”。