Ich habe eine Third-Party-Bibliothek, die eine Reihe von Schnittstellen und Buildern zum Konstruieren von Objekten aufweist, die die Schnittstellen implementieren. Diese konstruierten Objekte werden dann in Container übergeben. Ich habe dann eine Schnittstelle in meiner Anwendung, der ich eine Implementierung von einem Objekt hinzufügen möchte, das von dem Generator zurückgegeben wird.Schnittstelle zum vorhandenen Objekt hinzufügen
Third Party
interface ThirdParty1 { ... }
interface ThirdParty2 { ... }
class Builder {
...
public ThirdParty1 build() { ... }
}
class ThirdPartyContainer {
void append(ThirdParty1 toAdd) { ... }
ThirdParty1 take() { ... }
}
Meine Anwendung
interface MyInterface { ... }
class MainBody {
ThirdPartyContainer queue;
MainBody() {
ThirdParty1 foo = new Builder().build();
// something to add implementation of MyInterface to foo
queue.append(foo);
}
void calledLater() {
ThirdParty1 bar = queue.take();
if (bar instanceof MyInterface) {
// do something
} else if (bar instanceof ThirdParty2) {
// do something else
}
}
}
Ich weiß, ich könnte eine Wrapper-Klasse erstellen, die ThirdParty1 und MyInterface umgesetzt und nahm eine Instanz von Drittanbietern, die alle Anrufe, bei denen weitergeleitet. Dies bedeutet jedoch, dass, wenn Builder.build etwas zurückgibt, das eine Implementierung von ThirdParty1 und ThirdParty2 ist, die ThirdParty2-Implementierung vom Wrapper verloren gehen würde.
Ich erwarte, was ich nachher nicht möglich bin, aber ziemlich neu zu Java und all die Magie, die getan werden kann, war ich nicht sicher.
Nicht wirklich, nein. Java ist keine dynamische Sprache, in der solche Dinge möglich und sogar empfohlen wären. Es kann eine bequemere Lösung als ein Wrapper geben, wenn Sie Ihren Anwendungsfall weiter erläutern. – Kayaman
Meine Arbeit verwendet eine Map, die auf den vom Builder generierten Verweis auf Objekte verweist, die MyInterface implementieren, das funktioniert gut, aber ich hatte gehofft, dass Java eine elegantere Lösung zulässt, die das Aufdecken dieser Map verhindern würde. Danke – lachlan