Próbuję utworzyć klasę z wieloma parametrami, używając raczej wzorca Builder niż konstruktorów teleskopowych. Robię to w sposób opisany przez Efektywną Javę Joshua Blocha, z prywatnym konstruktorem na otaczającej klasie i publiczną statyczną klasą Builder. Klasa Builder zapewnia, że obiekt jest w stanie spójnym przed wywołaniem funkcji build(), w którym to momencie deleguje konstrukcję otaczającego obiektu do prywatnego konstruktora. Tak więc Konstruktor Java z typowymi granicami
public class Foo {
// Many variables
private Foo(Builder b) {
// Use all of b's variables to initialize self
}
public static final class Builder {
public Builder(/* required variables */) {
}
public Builder var1(Var var) {
// set it
return this;
}
public Foo build() {
return new Foo(this);
}
}
}
Następnie chcę dodać granice typu do niektórych zmiennych, a więc trzeba parametrize definicji klasy. Chcę, aby granice klasy Foo były takie same jak w klasie Builder.
public class Foo<Q extends Quantity> {
private final Unit<Q> units;
// Many variables
private Foo(Builder<Q> b) {
// Use all of b's variables to initialize self
}
public static final class Builder<Q extends Quantity> {
private Unit<Q> units;
public Builder(/* required variables */) {
}
public Builder units(Unit<Q> units) {
this.units = units;
return this;
}
public Foo build() {
return new Foo<Q>(this);
}
}
}
To kompiluje grzywny, ale kompilator pozwala mi robić rzeczy, czuję, że powinienem być błędy kompilatora. Na przykład.
public static final Foo.Builder<Acceleration> x_Body_AccelField =
new Foo.Builder<Acceleration>()
.units(SI.METER)
.build();
Oto argument jednostki nie jest Unit<Acceleration>
ale Unit<Length>
, ale wciąż jest akceptowane przez kompilator.
Co ja tu robię źle? Chcę podczas kompilacji upewnić się, że typy jednostek pasują poprawnie.
Dziękuję, nie myślałem bardzo wyraźnie w ten szacunek. – I82Much