抽象クラス (BaseThing) があるとします。これには、1 つの必須パラメーター ("base required") と 1 つのオプション パラメーター ("base optional") があります。それを拡張する具象クラスがあります(モノ)。また、1 つの必須パラメーター (「required」) と 1 つの省略可能なパラメーター (「optional」) もあります。次のようなものです:
public abstract class BaseThing {
public static final String DEFAULT_BASE_OPTIONAL = "Default Base Optional";
private final String baseRequired;
private String baseOptional = DEFAULT_BASE_OPTIONAL;
protected BaseThing(final String theBaseRequired) {
this.baseRequired = theBaseRequired;
}
final void setBaseOptional(final String newVal) {
this.baseOptional = newVal;
}
public final void selfDescribe() {
System.out.println("Base Required: " + baseRequired);
System.out.println("Base Optional: " + baseOptional);
selfDescribeHook();
}
protected abstract void selfDescribeHook();
}
と:
public final class Thing extends BaseThing {
public static final String DEFAULT_OPTIONAL = "Default Optional";
private final String required;
private String optional = DEFAULT_OPTIONAL;
Thing(final String theRequired, final String theBaseRequired) {
super(theBaseRequired);
required = theRequired;
}
@Override
protected void selfDescribeHook() {
System.out.println("Required: " + required);
System.out.println("Optional: " + optional);
}
void setOptional(final String newVal) {
optional = newVal;
}
}
Thing オブジェクト用の Joshua Bloch スタイルのビルダーが必要です。しかし、より一般的には、BaseThing の具体的な実装にビルダーを簡単に実装できるようにしたいので、私が本当に必要としている (私が思うに) のは、ThingBuilder、OtherThingBuilder、または SuperThingBuilder を簡単に作成できる BaseThing ビルダーです。 .
私が思いついた次の方法よりも良い方法はありますか (または、私が思いついたものに問題がありますか)?
public abstract class BaseThingBuilder<T extends BaseThing> {
private String baseOptional = BaseThing.DEFAULT_BASE_OPTIONAL;
public BaseThingBuilder<T> setBaseOptional(final String value) {
baseOptional = value;
return this;
}
public T build() {
T t = buildHook();
t.setBaseOptional(baseOptional);
return t;
}
protected abstract T buildHook();
}
と:
public final class ThingBuilder extends BaseThingBuilder<Thing> {
private final String baseRequired;
private final String required;
private String optional = Thing.DEFAULT_OPTIONAL;
public ThingBuilder(final String theRequired,
final String theBaseRequired) {
required = theRequired;
baseRequired = theBaseRequired;
}
public ThingBuilder setOptional(final String value) {
optional = value;
return this;
}
protected Thing buildHook() {
Thing thing = new Thing(required, baseRequired);
thing.setOptional(optional);
return thing;
}
}
これは、次のような方法で Thing オブジェクトを構築するために使用できます。
BaseThingBuilder<Thing> builder =
new ThingBuilder("Required!", "Base Required!")
.setOptional("Optional!")
.setBaseOptional("Base Optional!");
Thing thing = builder.build();
thing.selfDescribe();
どの出力:
Base Required: Base Required!
Base Optional: Base Optional!
Required: Required!
Optional: Optional!
私が知っているが、特に重要とは考えていない問題の 1 つは (改善できるのであればそうするのが良いでしょう)、基本オプションを設定する前に、基本以外のすべてのオプションを設定する必要があることです。そうしないと、setBaseOptional() が ThingBuilder ではなく BaseThingBuilder を返すため、構文エラーが発生します。
前もって感謝します。