【问题标题】:How can we add additional constructor when Builder pattern is being used使用 Builder 模式时如何添加额外的构造函数
【发布时间】:2021-06-12 04:42:14
【问题描述】:

我想添加一个额外的构造,它以Exception, status 作为参数并构造message as = exception.getMessage();

如果我们使用 lombok Builder 模式,我们如何做到这一点

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Foo {
    private String message;
    private Integer status;
        
    @Builder.Default
    private LocalDateTime timestamp = LocalDateTime.now();
}

【问题讨论】:

  • 为什么不使用Foo.builder().status(status).message(exception.getMessage()).build();
  • @GauthamM 这很快就变得非常笨拙,没有任何用处; Amazon Java SDK 2 是一团糟。
  • @chrylis-cautiouslyoptimistic- 抱歉,我没明白你的意思。
  • 您只是想要一个额外的构造函数,还是希望构建器有一个将异常作为参数的setter?
  • 只是一个额外的构造函数,绝对不是setter

标签: java lombok


【解决方案1】:

在你的自定义构造函数中使用Builder注解,如下所示:

如果您想对所有构造使用相同的builder() 方法:

import java.time.LocalDateTime;
import java.util.Objects;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Foo {
    private String message;
    private Integer status;
    private LocalDateTime timestamp = LocalDateTime.now();

    @Builder
    public Foo(Integer status, String message, Exception exception) {
        this.status = status;

        if(Objects.nonNull(exception)) {
            this.message = exception.getMessage();
        } else {
            this.message = message;
        }
    }
}

例子:

Foo foo1 = Foo.builder().exception(new Exception("Message")).status(100).build();

Foo foo2 = Foo.builder().message("Test").status(100).build();

如果你想使用完全不同的结构:

import java.time.LocalDateTime;
import java.util.Objects;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Foo {
    private String message;
    private Integer status;

    @Builder.Default
    private LocalDateTime timestamp = LocalDateTime.now();

    @Builder(builderClassName = "FooBuilder1", builderMethodName = "builder1")
    public Foo(Integer status, Exception exception) {
        this.status = status;

        if(Objects.nonNull(exception)) {
            this.message = exception.getMessage();
        }

        this.timestamp = LocalDateTime.now();
    }
}

创建对象时:

Foo foo1 = Foo.builder1().exception(new Exception("message")).status(100).build();
Foo foo2 = Foo.builder().message("Test").status(100).build();

注意:除非您使用不同的构建器类名和构建器方法,如上例所示,否则两个 @Builder 注释将不起作用。

【讨论】:

  • 除非您使用不同的 builderClassNames,否则两个 @Builder 注释将不起作用。
  • @JanRieke,更新答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2012-01-18
相关资源
最近更新 更多