Die Ausnahmeschnittstelle, die Sie mit einem Konstruktor mit Argumenten versuchen, ist schwierig zu verwenden, nicht wahr? Das ist die Geschichte.
Zum Beispiel, wenn Sie eine Ausnahme mit zwei eindeutigen Feldern machen möchten
@Getter
public class SampleException extends RuntimeException {
private String code;
private String id;
...
Wir werden darüber sprechen, welche Art von Konstruktor vorbereitet werden soll.
id
Es ist schon schwer, über die Kombination davon nachzudenken und einen Konstruktor zu erstellen. Da "Code", "ID" und "Nachricht" vom gleichen Typ sind, ist es außerdem nicht möglich, einen Konstruktor zu erstellen, der nur diesen für jeden festlegt.
public SampleException(String message, String id, String code) {
super(message);
this.id = id;
this.message = message;
}
Sie können Null an die Stelle setzen, an der Sie nicht eintreten können. Sie könnten denken, aber es ist nicht klug. Wenn die Anzahl der Konstruktoren zunimmt, muss sich der Benutzer auch um die Reihenfolge sorgen, was schwierig ist. (Wenn Sie Javadoc richtig schreiben, können Sie es verstehen, aber wenn Sie es nicht einzeln sehen, werden Sie es nicht verstehen.) Es ist dieses Level mit zwei Feldern, also wäre es katastrophal, wenn es mehr Felder gäbe ...
@Getter
public class SampleException extends RuntimeException {
private String code;
private String id;
private SampleException(String message, Throwable cause) {
super(message, cause);
}
public static class SampleExceptionThrower {
private String message;
private Throwable cause;
private String code;
private String id;
private SampleExceptionThrower() {
}
public static void call(Consumer<SampleExceptionThrower> consumer) {
SampleExceptionThrower builder = new SampleExceptionThrower();
consumer.accept(builder);
SampleException exception = new SampleException(builder.message, builder.cause);
exception.code = builder.code;
exception.id = builder.id;
throw exception;
}
public SampleExceptionThrower setMessage(String message) {
this.message = message;
return this;
}
public SampleExceptionThrower setCause(Throwable cause) {
this.cause = cause;
return this;
}
public SampleExceptionThrower setId(String id) {
this.id = id;
return this;
}
public SampleExceptionThrower setCode(String code) {
this.code = code;
return this;
}
}
}
Fließendes Builder-Muster. Sie können es so verwenden.
SampleExceptionThrower.call(builder -> builder.setCause(e)
.setMessage("message").setCode("code"));
Sehr sauber!
Ich mag den Namensruf nicht, also gib mir bitte ein paar gute Ideen ...
Recommended Posts