Wie erstelle ich eine Klasse, die ich nicht ändern kann, um eine Schnittstelle zu implementieren?

Ich habe eine Klasse aus einer anderen Bibliothek, die Closed Source ist, aber ich möchte eine Schnittstelle dafür verwenden können. Der Grund dafür ist, dass ich nicht machen willinstanceof Schecks odernull-checks überall, aber ich möchte die bestehende Klasse auch nicht erweitern.

Angenommen, ich habe folgenden Code:

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();
    }
}

Ich kann mich nicht ändernQuietFoo:

public class QuietFoo {

    public void bar() {
        System.out.println("bar");
    }
}

Aber ichkönnen VeränderungLoudFoo:

public class LoudFoo {

    public void bar() {
        System.out.println("BAR!!");
    }
}

Das Problem ist, dass es viele andere Implementierungen von geben kannbar in vielen Klassen und es kann mehr Methoden als nur gebenbar, so würde nicht nur meinehandle Methode langsam und hässlich mit vielinstanceof Anweisungen, aber ich müsste eine dieser Handle-Methoden für jede Methode auf schreibenQuietFoo undLoudFoo. Das Erweitern ist keine praktikable Lösung, da es das Ganze verletztist ein Vertrag seitLoudFoo ist keinQuietFoo.

Grundsätzlich gegebenFoo:

public interface Foo {
    void bar();
}

Wie kann ich machenQuietFoo implementierenFoo ohne die Quelle zu ändern, muss ich also kein Casting machen undinstanceof Anrufe überall in meinem Code?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage