L'interface d'exception que vous essayez de faire avec un constructeur avec des arguments est difficile à utiliser, n'est-ce pas? Voilà l'histoire.
Par exemple, si vous souhaitez créer une exception avec deux champs uniques
@Getter
public class SampleException extends RuntimeException {
private String code;
private String id;
...
Nous parlerons du type de constructeur à préparer.
code
message
cause
Il est déjà difficile de penser à la combinaison de tout cela et de commencer à créer un constructeur. De plus, comme «code», «id» et «message» sont du même type, il n'est pas possible de créer un constructeur qui ne définit que cela pour chacun.
public SampleException(String message, String id, String code) {
super(message);
this.id = id;
this.message = message;
}
Vous pouvez mettre Null à l'endroit où vous ne pouvez pas entrer. Vous pourriez penser, mais ce n'est pas intelligent. De plus, à mesure que le nombre de constructeurs augmente, l'utilisateur doit se soucier de la commande, ce qui est difficile. (Si vous écrivez correctement javadoc, vous pouvez le comprendre, mais si vous ne le voyez pas un par un, vous ne le comprendrez pas.) C'est ce niveau avec deux champs, donc ce serait désastreux s'il y avait plus de champs ...
@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;
}
}
}
Modèle Fluent Builder. Vous pouvez l'utiliser comme ça.
SampleExceptionThrower.call(builder -> builder.setCause(e)
.setMessage("message").setCode("code"));
Très propre!
Je n'aime pas l'appel du nom, alors donnez-moi quelques bonnes idées ...
Recommended Posts