Die kurze Antwort ist, es gibt nichts in Java so nah wie Sie möchten, aber es gibt Alternativen. Das Delegiertenmuster ist nicht schwer zu implementieren, es ist einfach nicht so praktisch wie mit Objective-C. Der Grund "informelle Protokolle" in Objective-C funktioniert, weil die Sprache unterstützt Kategorien, mit denen Sie Methoden zu vorhandenen Klassen hinzufügen, ohne Unterklasse sie oder sogar Zugriff auf den Quellcode haben. Daher sind die meisten informellen Protokolle eine Kategorie für NSObject. Dies ist in Java eindeutig unmöglich.
Objective-C 2.0 entscheidet sich für @optional Protokoll-Methoden, die eine viel sauberere Abstraktion ist und für neuen Code, aber noch weiter von einem Äquivalent in Java.
Ehrlich gesagt, ist der flexibelste Ansatz, ein Delegate-Protokoll zu definieren, dann haben Klassen implementieren alle Methoden. (Bei modernen IDEs wie Eclipse ist das trivial.) Viele Java-Schnittstellen haben eine begleitende Adapterklasse. Dies ist ein gängiger Ansatz, da der Benutzer nicht viele leere Methoden implementieren muss, aber die Vererbung einschränkt, was das Code-Design unflexibel macht . (Josh Bloch spricht das in seinem Buch "Effective Java" an.) Mein Vorschlag wäre, zuerst eine Schnittstelle bereitzustellen und dann einen Adapter hinzuzufügen, wenn es wirklich notwendig ist.
Was auch immer Sie tun, vermeiden Sie werfen UnsupportedOperationException
für "nicht implementiert" Methoden. Dies zwingt die delegierende Klasse, Ausnahmen für Methoden zu behandeln, die optional sein sollten. Der richtige Ansatz besteht darin, eine Methode zu implementieren, die nichts tut, einen Standardwert zurückgibt usw. Diese Werte sollten für Methoden, die keinen void-Rückgabetyp aufweisen, gut dokumentiert sein.
Werfen 'UnsupportedOperationException' ist eine schreckliche Idee! APIs sollten Benutzer niemals dazu zwingen, Ausnahmen in normalen Verwendungsmustern zu behandeln, nur für einen außergewöhnlichen Fluss. Das Delegatmuster in Cocoa ist insofern robust, als es stillschweigend nicht implementierte Delegate-Methoden übergibt. –
Sehr guter Punkt. Ich hatte vergessen, wie nervig Java-Ausnahmen sind. –
@Quinn Taylor: Allerdings wurden in vielen Teilen der Java-Bibliothek "optionale" Protokolle * erstellt. Zum Beispiel gibt die Schnittstelle "Collection" an, dass Methoden wie add() und remove() "optionale Operationen" sind, die UnsupportedOperationException auslösen, wenn sie diese nicht unterstützen. – newacct