以下のクラスにビルダーパターンを使用しようとしています..最初はクラスのコンストラクターを使用してすべてのパラメーターを設定していましたが、偶然ビルダーパターンに出くわし、ユースケースに適しています。
以下は、人々がほとんど合格する私のクラスであり、userId
常にですが、他のフィールドはオプションであり、合格する場合と合格しない場合があります。また、タイムアウト値を渡していない場合は、デフォルトのタイムアウト値を常に 500 に設定する必要がありますが、タイムアウト値を渡している場合は、デフォルトのタイムアウト値を上書きする必要があります。ここで、Preference は 4 つのフィールドを持つ ENUM です。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(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
以下は、コンストラクターにパラメーターを渡してオブジェクトを構築するために最初に使用した例です。最初はすべてのパラメーターを渡していましたが、クライアントはほとんどを渡しますuserId
、clientId
およびparameterMap
always およびその他のフィールドはオプションです..
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にゼロまたは負の数値を渡すことができる可能性があります..