Wie verwende ich das von Joshua Bloch in meiner ModelInput-Klasse beschriebene Builder-Muster?

Ich versuche, Builder-Muster für meine untergeordnete Klasse zu verwenden. Ursprünglich verwendete ich den Konstruktor meiner Klasse, um alle Parameter festzulegen, aber aus Versehen stieß ich auf Builder-Muster, das für meinen Anwendungsfall gut aussieht.

Unten ist meine Klasse, in der die meisten Leute vorbeikommenuserId, clientId undparameterMap immer, aber andere Felder sind optional und können es passieren oder auch nicht. Und auch wenn sie keinen Timeout-Wert übergeben, muss der Standard-Timeout-Wert immer auf 500 eingestellt sein. Wenn sie jedoch einen Timeout-Wert übergeben, sollte er meinen Standard-Timeout-Wert überschreiben. Hier ist Preference eine ENUM mit vier Feldern.

public final class ModelInput {

    private long userid;
    private long clientid;
    private long timeout = 500L;
    private Preference pref;
    private boolean debug;
    private Map<String, String> parameterMap;

    public ModelInput(long userid, long clientid, Preference pref, Map<String, String> parameterMap, long timeout, boolean debug) {
        this.userid = userid;
        this.clientid = clientid;
        this.pref = pref;
        this.parameterMap = parameterMap;
        this.timeout = timeout;
        this.debug = debug;
    }

 ... //getters here
}    

Unten ist ein Beispiel, wie ich anfänglich verwendet habe, um zu konstruierenModelInput Objekt durch Übergabe von Parametern an Konstruktor. Anfangs habe ich alle Parameter übergeben, aber die Clients werden meistens übergebenuserId, clientId undparameterMap always und andere Felder sind optional.

Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("attribute", "segmentation");

ModelInput input = new ModelInput(109739281L, 20L, Preference.SECONDARY, paramMap, 1000L, true);

Wie kann ich den obigen Code konvertieren, um das Builder-Muster zu verwenden, wie es von Bloch in Effective Java beschrieben wird, das auch threadsicher und unveränderlich ist?

Und wie kann ich die Validierungsprüfung auch mit dem Builder-Muster durchführen? Es ist möglich, dass Benutzer die Benutzer-ID Null oder negative Zahlen mit der Client-ID und dem Timeout sowie mit der Karte übergeben können.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage