Como eu faço uma classe, que não posso mudar, implementar uma interface?
Eu tenho uma classe de outra biblioteca que é de código fechado, mas eu quero ser capaz de usar uma interface para isso. A razão é que eu não quero fazerinstanceof
cheques ounull
-Verificações em todos os lugares, mas eu também não quero estender a classe existente.
Por exemplo, digamos que eu tenha 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();
}
}
Eu não posso mudarQuietFoo
:
public class QuietFoo {
public void bar() {
System.out.println("bar");
}
}
Mas euposso mudançaLoudFoo
:
public class LoudFoo {
public void bar() {
System.out.println("BAR!!");
}
}
O problema é que pode haver muitas outras implementações debar
em muitas classes, e pode haver mais métodos do que apenasbar
, então não só meuhandle
método ficar lento e feio com muitainstanceof
declarações, mas eu teria que escrever um desses métodos para cada método emQuietFoo
eLoudFoo
. Estender não é uma solução viável porque viola todoé um contrato desdeLoudFoo
não é umQuietFoo
.
Basicamente, dadoFoo
:
public interface Foo {
void bar();
}
Como posso fazerQuietFoo
implementoFoo
sem alterar a sua fonte, então eu não tenho que fazer fundição einstanceof
chama em todos os lugares no meu código?