Otra opción que puede considerar.
decir que quiere reducir la API de alguna clase:
public class LargeApi {
public void doFoo() { ... }
public void doBar() { ... }
public void doBaz() { ... }
...
...
}
De tal manera que los clientes sólo estarían expuestos a decir que el método doFoo (o cualquier método que prefiere a utilizar en su lugar):
public interface ReducedApi {
void doFoo();
}
Pero para que las instancias de la ReducedApi para ser utilizado en cualquier lugar se espera que el LargeApi, se necesita una manera de volver a la LargeApi (preferiblemente sin casting):
public interface ReducedApi {
void doFoo();
LargeApiClass asLargeApiClass();
}
un ejemplo de implementación obligar a los clientes a usar su nueva API reducida podría ser similar al siguiente:
public class ReducedApiImpl
extends LargeApi
implements ReducedApi {
// Don't let them instantiate directly, force them to use the factory method
private ReducedApiImpl() {
}
// Notice, we're returning the ReducedApi interface
public static ReducedApi newInstance() {
return new ReducedApiImpl();
}
@Override
public void doFoo() {
super.doFoo();
}
@Override
public LargeApi asLargeApi() {
return this;
}
}
Ahora sus clientes pueden usar su API reducida para el caso común, pero fundido de nuevo a la gran api cuando sea necesario:
ReducedApi instance = ReducedApiImpl.newInstance();
instance.doFoo();
callSomeMethodExpectingLargeApi(instance.asLargeApi());
La segunda solución era más o menos lo que tenía en mente en primer lugar ... pero tendré que replicar manualmente todos los métodos deseados. La primera solución parece "impura" para mí ... un montón de desorden y códigos no deseados. –
Sí, eso es cierto. Supongo que, dependiendo de cuál sea la proporción de métodos que se mantendrán/métodos a rechazar, una de las soluciones podría verse "más limpia" que la otra. p.ej. si solo quiere prohibir 2-3 métodos de 20, entonces A probablemente se vea más limpio. Si solo quiere mantener 2-3 métodos de 20, entonces B se ve más limpio. Pero todo lo demás es igual, también tiendo a preferir B sobre A. – Grodriguez
'UnsupportedOperationException' viola la sustitución de Liskov ... –