Sto lavorando su un problema in cui sono presenti diverse implementazioni di Foo
, accompagnate da diversi FooBuilder
. Mentre la condivisione di Foo
condivide molte variabili comuni che devono essere impostate, hanno anche variabili distinte che richiedono il loro rispettivo FooBuilder
per implementare alcune funzionalità specifiche. Per brevità, mi piacerebbe avere la 'S setter FooBuilder
usare il metodo concatenamento, come:Java: restituzione della sottoclasse in modalità superclasse firma
public abstract class FooBuilder {
...
public FooBuilder setA(int A) {
this.A = A;
return this;
}
...
}
e
public class FooImplBuilder extends FooBuilder{
...
public FooImplBuilder setB(int B) {
this.B = B;
return this;
}
public FooImplBuilder setC(int C) {
this.C = C;
return this;
}
...
}
E così via, con diversi FooBuilder
implementazioni. Questo tecnicamente fa tutto ciò che voglio, tuttavia, questo approccio è sensibile all'ordine delle chiamate dei metodi quando viene eseguito il concatenamento del metodo. Il metodo seguente è undefined errori di compilazione:
someFoo.setA(a).setB(b)...
richiedono che lo sviluppatore pensare l'ordine delle chiamate di metodo nella catena. Per evitare ciò, mi piacerebbe che i setter in FooBuilder
restituissero in qualche modo la sottoclasse di implementazione effettiva. Tuttavia, non sono sicuro di come farlo. Qual è l'approccio migliore?
Inoltre, obbliga a lanciare ovunque, o impedisce di modificare le proprietà delle superclassi quando si desidera. –