Как мы можем добавить дополнительный конструктор, когда используется шаблон конструктора

#java #lombok

Вопрос:

Я хочу добавить дополнительную конструкцию, которая принимает 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();
}
 

Комментарии:

1. Почему бы не использовать Foo.builder().status(status).message(exception.getMessage()).build(); ?

2. @GauthamM, Который быстро становится действительно громоздким без всякой полезной цели; Amazon Java SDK 2-это гигантский беспорядок.

3. @chrylis-осторожно оптимистично — Извините, но я не понял вашу точку зрения.

4. Вам просто нужен дополнительный конструктор или вы также хотите, чтобы у конструктора был сеттер, который принимает исключение в качестве аргумента?

5. просто дополнительный конструктор, определенно не сеттер

Ответ №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 аннотации не будут работать, если вы не используете разные имена классов и методы компоновщика, как показано в приведенном выше примере.

Комментарии:

1. Две @Builder аннотации не будут работать, если вы не используете разные builderClassName s.

2. @JanRieke, Обновленный ответ 🙂