Wie kann das Builder-Muster verbessert werden?

Motivation

Kürzlich habe ich nach einer Möglichkeit gesucht, ein komplexes Objekt zu initialisieren, ohne viele Parameter an den Konstruktor zu übergeben. Ich habe es mit dem Builder-Muster versucht, aber es gefällt mir nicht, dass ich beim Kompilieren nicht überprüfen kann, ob ich wirklich alle erforderlichen Werte festgelegt habe.

Traditionelles Baumuster

Wenn ich das Builder-Muster verwende, um meineComplex Objekt ist die Erstellung "typsicherer", da leichter zu erkennen ist, wofür ein Argument verwendet wird:

new ComplexBuilder()
        .setFirst( "first" )
        .setSecond( "second" )
        .setThird( "third" )
        ...
        .build();

Aber jetzt habe ich das Problem, dass ich einen wichtigen Parameter leicht übersehen kann. Ich kann das im Internet nachprüfenbuild() Methode, aber das ist nur zur Laufzeit. Beim Kompilieren warnt mich nichts, wenn ich etwas verpasst habe.

Verbessertes Builder-Muster

Nun war meine Idee, einen Builder zu erstellen, der mich "erinnert", wenn ich einen benötigten Parameter verpasst habe. Mein erster Versuch sieht so aus:

public class Complex {
    private String m_first;
    private String m_second;
    private String m_third;

    private Complex() {}

    public static class ComplexBuilder {
        private Complex m_complex;

        public ComplexBuilder() {
            m_complex = new Complex();
        }

        public Builder2 setFirst( String first ) {
            m_complex.m_first = first;
            return new Builder2();
        }

        public class Builder2 {
            private Builder2() {}
            Builder3 setSecond( String second ) {
                m_complex.m_second = second;
                return new Builder3();
            }
        }

        public class Builder3 {
            private Builder3() {}
            Builder4 setThird( String third ) {
                m_complex.m_third = third;
                return new Builder4();
            }
        }

        public class Builder4 {
            private Builder4() {}
            Complex build() {
                return m_complex;
            }
        }
    }
}

Wie Sie sehen, gibt jeder Setter der Builder-Klasse eine andere interne Builder-Klasse zurück. Jede interne Builder-Klasse bietet genau eine Setter-Methode und die letzte bietet nur eine build () -Methode.

Nun sieht die Konstruktion eines Objekts wieder so aus:

new ComplexBuilder()
    .setFirst( "first" )
    .setSecond( "second" )
    .setThird( "third" )
    .build();

... aber es gibt keine Möglichkeit, einen benötigten Parameter zu vergessen. Der Compiler würde das nicht akzeptieren.

Optionale Parameter

Wenn ich optionale Parameter hätte, würde ich die letzte interne Builder-Klasse verwendenBuilder4 sie wie ein "traditioneller" Erbauer zu setzen, kehrt von selbst zurück.

FragenIst das ein bekanntes Muster? Hat es einen besonderen Namen?Sehen Sie irgendwelche Fallstricke?Haben Sie Ideen zur Verbesserung der Implementierung - im Sinne von weniger Codezeilen?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage