Jak używać wzoru Buildera opisanego przez wersję Joshuy Blocha w mojej klasie ModelInput?

Próbuję użyć wzorca Builder dla mojej poniższej klasy .. Początkowo używałem konstruktora mojej klasy do ustawiania wszystkich parametrów, ale przypadkowo natrafiłem na wzór Buildera i wygląda on dobrze dla mojego przypadku użycia.

Poniżej znajduje się moja klasa, w której ludzie przeważnie przejdąuserId, clientId iparameterMap zawsze, ale inne pola są opcjonalne i mogą je przekazać. A także jeśli nie przekazują żadnej wartości limitu czasu, zawsze muszę mieć domyślną wartość limitu czasu ustawioną na 500, ale jeśli przekazują jakąkolwiek wartość limitu czasu, powinna ona zastąpić domyślną wartość limitu czasu. Tutaj preferencja to ENUM mający cztery pola.

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
}    

Poniżej znajduje się przykład, w jaki sposób początkowo korzystałem z konstrukcjiModelInput obiekt przekazując parametry do konstruktora. Początkowo przekazywałem wszystkie parametry, ale klienci przeważnie przejdąuserId, clientId iparameterMap zawsze i inne pola są opcjonalne ..

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

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

Jak przekonwertować mój powyższy kod, aby zacząć używać wzorca Builder, jak powiedział Bloch w Effective Java, który jest również bezpieczny w wątku i niezmienny?

I jak mogę sprawdzić sprawdzanie poprawności również na tym schemacie Builder? Może się zdarzyć, że ludzie będą mogli przekazywać zero lub liczby ujemne takie same z identyfikatorem klienta i limitem czasu, a także z mapą.

questionAnswers(4)

yourAnswerToTheQuestion