Estoy trabajando en un problema donde hay varias implementaciones de Foo
, acompañadas de varias FooBuilder
. Mientras que Foo
comparten varias variables comunes que deben establecerse, también tienen variables distintas que requieren sus respectivos FooBuilder
para implementar alguna funcionalidad específica. Para la concisión, me gustaría tener los FooBuilder
's emisores de utilizar el método de encadenamiento, como:Java: devolución de la subclase en el método de la superclase firma
public abstract class FooBuilder {
...
public FooBuilder setA(int A) {
this.A = A;
return this;
}
...
}
y
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;
}
...
}
Y así sucesivamente, con varias implementaciones diferentes FooBuilder
. Esto técnicamente hace todo lo que quiero, sin embargo, este enfoque es sensible al orden de las llamadas a métodos cuando se realiza el encadenamiento de métodos. El siguiente método tiene indefinido errores de compilación:
someFoo.setA(a).setB(b)...
que requieren que el desarrollador piensa en el orden de las llamadas de método en la cadena. Para evitar esto, me gustaría que los setters en FooBuilder
de alguna manera devuelvan la subclase de implementación real. Sin embargo, no estoy seguro de cómo hacer esto. ¿Cuál es el mejor enfoque?
Además, fuerza fundición en todas partes, o le impide cambiar propiedades de superclases cuando lo desee. –