#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, Обновленный ответ 🙂