1

以下のクラスにビルダーパターンを使用しようとしています..最初はクラスのコンストラクターを使用してすべてのパラメーターを設定していましたが、偶然ビルダーパターンに出くわし、ユースケースに適しています。

以下は、人々がほとんど合格する私のクラスであり、userId常にですが、他のフィールドはオプションであり、合格する場合と合格しない場合があります。また、タイムアウト値を渡していない場合は、デフォルトのタイムアウト値を常に 500 に設定する必要がありますが、タイムアウト値を渡している場合は、デフォルトのタイムアウト値を上書きする必要があります。ここで、Preference は 4 つのフィールドを持つ ENUM です。clientIdparameterMap

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
}    

ModelInput以下は、コンストラクターにパラメーターを渡してオブジェクトを構築するために最初に使用した例です。最初はすべてのパラメーターを渡していましたが、クライアントはほとんどを渡しますuserIdclientIdおよびparameterMapalways およびその他のフィールドはオプションです..

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

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

上記のコードを変換して、スレッドセーフで不変でもある効果的な Java で Bloch の言うように Builder パターンの使用を開始するにはどうすればよいですか?

そして、ビルダーパターンを使用して、これに対して検証チェックを行うにはどうすればよいですか? クライアントIDとタイムアウト、およびマップと同じように、ユーザーIDにゼロまたは負の数値を渡すことができる可能性があります..

4

4 に答える 4

4

Builder コンストラクターには、必須パラメーターが必要です。したがって、あなたの場合、userId、clientId、および parameterMap が必須の場合、次のようになります。

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(Builder builder) {
        this.userid = builder.userId;
        this.clientid = builder.clientId;
        this.pref = builder.preference;
        this.parameterMap = builder.parameterMap;
        this.timeout = builder.timeout;
        this.debug = builder.debug;
    }

    public static class Builder {
        private long userId;
        private long clientId;
        private Preference preference;
        private boolean debug;
        private Map<String, String> parameterMap;

        public Builder(long userId, long clientId, Map<String, String> parameterMap) {
            this.userId = userId;
            this.clientId = clientId;
            this.parameterMap = parameterMap;
        }

        public Builder preference(Preference preference) {
            this.preference = preference;
            return this;
        }

        public Builder debug(boolean debug) {
            this.debug = debug;
            return this;
        }

        public Builder timeout(long timeout) {
            this.timeout = timeout;
            return this;
        }

        ...

        public ModelInput build() {
            return ModelInput(this);
        }
    }

    // ModelInput getters / setters
}

ビルダー クラスの使用方法は次のとおりです。

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

ModelInput.Builder builder = new ModelInput.Builder(109739281L, 20L, paramMap);
builder.preference(Preference.SECONDARY).timeout(1000L).debug(true);

ModelInput modelInput = builder.build();

お役に立てれば :)

于 2014-01-10T10:29:59.293 に答える
0

これを試して

public final class ModelInput {
    ...

    public static class Builder {
        private long userid;
        ...

        public Builder setUserId(long userId) {
            this.userId = userId;
        }
        ...

        public ModelInput build() {
            return new ModelInput(userId,...
        }
    }
}  
于 2014-01-10T10:10:40.010 に答える