¿Cómo hago una clase, que no puedo cambiar, implemento una interfaz?
Tengo una clase de otra biblioteca que es de código cerrado, pero quiero poder usar una interfaz para ella. La razón es que no quiero hacer.instanceof
cheques onull
- verifica en todas partes, pero tampoco quiero extender la clase existente.
Por ejemplo, digamos que tengo este código:
public class Example {
// QuietFoo is from another library that I can't change
private static QuietFoo quietFoo;
// LoudFoo is my own code and is meant to replace QuietFoo
private static LoudFoo loudFoo;
public static void main(String[] args) {
handle(foo);
}
private static void handle(Object foo) {
if (foo instanceof QuietFoo)
((QuietFoo) foo).bar();
else if (foo instanceof LoudFoo)
((LoudFoo) foo).bar();
}
}
No puedo cambiarQuietFoo
:
public class QuietFoo {
public void bar() {
System.out.println("bar");
}
}
Pero yopuede cambioLoudFoo
:
public class LoudFoo {
public void bar() {
System.out.println("BAR!!");
}
}
El problema es que puede haber muchas otras implementaciones debar
en muchas clases, y puede haber más métodos que simplementebar
, así que no solo mihandle
método se vuelve lento y feo con un montón deinstanceof
declaraciones, pero tendría que escribir uno de estos métodos de manejo para cada método enQuietFoo
yLoudFoo
. Extender no es una solución viable porque viola el conjuntoes un contrato desdeLoudFoo
no es unQuietFoo
.
Básicamente, dadoFoo
:
public interface Foo {
void bar();
}
Como puedo hacerQuietFoo
implementarFoo
Sin cambiar su fuente, así que no tengo que hacer casting yinstanceof
¿Llama a todas partes en mi código?