Geben Sie diesem Artikel von Dr. Dobbs und insbesondere dem Builder-Muster an, wie wir mit dem Fall der Unterklasse eines Builders umgehen. Eine naive Implementierung wäre eine gekürzte Version des Beispiels, in dem wir eine Unterklasse zum Hinzufügen einer GVO-Kennzeichnung erstellen möchten:
public class NutritionFacts {
private final int calories;
public static class Builder {
private int calories = 0;
public Builder() {}
public Builder calories(int val) { calories = val; return this; }
public NutritionFacts build() { return new NutritionFacts(this); }
}
protected NutritionFacts(Builder builder) {
calories = builder.calories;
}
}
Unterklasse:
public class GMOFacts extends NutritionFacts {
private final boolean hasGMO;
public static class Builder extends NutritionFacts.Builder {
private boolean hasGMO = false;
public Builder() {}
public Builder GMO(boolean val) { hasGMO = val; return this; }
public GMOFacts build() { return new GMOFacts(this); }
}
protected GMOFacts(Builder builder) {
super(builder);
hasGMO = builder.hasGMO;
}
}
Jetzt können wir Code wie folgt schreiben:
GMOFacts.Builder b = new GMOFacts.Builder();
b.GMO(true).calories(100);
Aber wenn wir die Reihenfolge falsch verstehen, schlägt alles fehl:
GMOFacts.Builder b = new GMOFacts.Builder();
b.calories(100).GMO(true);
Das Problem ist natürlich, dass NutritionFacts.Builder
a zurückgegeben wird NutritionFacts.Builder
, nicht a GMOFacts.Builder
. Wie lösen wir dieses Problem, oder gibt es ein besseres Muster?
Hinweis: Diese Antwort auf eine ähnliche Frage bietet die Klassen, die ich oben habe. Meine Frage bezieht sich auf das Problem, sicherzustellen, dass die Builder-Aufrufe in der richtigen Reihenfolge sind.
build()
die Ausgabe von b.GMO(true).calories(100)
?