[JAVA] Créez des exceptions avec une interface fluide

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.

supposition

Exception problématique

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.

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 ...

Résolu avec une interface fluide

@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!

Épilogue

Je n'aime pas l'appel du nom, alors donnez-moi quelques bonnes idées ...

Recommended Posts

Créez des exceptions avec une interface fluide
Gestion des exceptions avec une interface fluide
Créez un terrain de jeu avec Xcode 12
Créez un environnement Vue3 avec Docker!
Profitez de la programmation avec un style lambda et une interface fluide
Créez un fichier jar avec la commande
[Rails6] Créer une nouvelle application avec Rails [Débutant]
Créez une application Web simple avec Dropwizard
[Retrait des rails] Créez une fonction de retrait simple avec des rails
[Rails 5] Créer une nouvelle application avec Rails [Débutant]
[Memo] Créez facilement un environnement CentOS 8 avec Docker
Créez une application de recherche simple avec Spring Boot
Créer un CSR avec des informations étendues en Java
Créez un tableau d'affichage simple avec Java + MySQL
[Rails] rails nouveau pour créer une base de données avec PostgreSQL
[Windows] [IntelliJ] [Java] [Tomcat] Créer un environnement pour Tomcat 9 avec IntelliJ
Créons un processus chronométré avec la minuterie de Java! !!
[Java] Créer une collection avec un seul élément
Créez une discussion d'équipe avec Rails Action Cable
Créer un compte SandBox avec IP Fastlane Spaces
Créer un serveur API Web avec Spring Boot
Créer un environnement de développement Spring Boot avec docker
Essayez de créer avec Trailblazer
[Java] Créer un filtre
Créer un site EC avec Rails 5 ⑨ ~ Créer une fonction de panier ~
Créez un modèle pour le widget iOS14 avec la configuration d'intention.
Créez une application de chat avec WebSocket (Tyrus) + libGDX + Kotlin
[Note] Créez un environnement Java à partir de zéro avec docker
Créer un service avec un modèle vide Liferay 7.0 / DXP
Créez un site de démonstration simple avec Spring Security avec Spring Boot 2.1
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
Tutoriel pour créer un blog avec Rails pour les débutants Partie 1
Créer un contrôle de page qui peut être utilisé avec RecyclerView
Créez une image Docker avec le JDK Oracle installé (miam
[Rails] J'ai essayé de créer une mini application avec FullCalendar
Créez une application Web Hello World avec Spring Framework + Jetty
Créer un SlackBot avec AWS lambda et API Gateway en Java
Une histoire à laquelle j'étais accro avec toString () d'Interface qui était proxy avec JdkDynamicAopProxy
Jusqu'à ce que vous créiez une application Web avec Servlet / JSP (Partie 1)
Tutoriel pour créer un blog avec Rails pour les débutants Partie 2
J'ai essayé de créer un environnement de développement padrino avec Docker
Tutoriel pour créer un blog avec Rails pour les débutants Partie 0
Créer une API XML-RPC avec Wicket
Créer une méthode java [Memo] [java11]
Créez un plugin VSCode.
Créer une loterie avec Ruby
Créer un micro service avec Spring Boot
Comment créer une méthode
Une histoire bloquée avec NotSerializableException
[SAP] Créez un environnement de développement avec NW AS ABAP Developer Edition (1)
Créez un serveur Web simple avec la bibliothèque standard Java com.sun.net.httpserver
J'ai créé une interface de ligne de commande avec WinMerge Plugin en utilisant JD-Core
Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ④ ~ Personnaliser le message d'erreur ~