TL; DR: Tu das nicht.
Was Sie hier zeigen, ist spröder Code.
Eine Schnittstelle ist ein Vertrag. Es heißt: "Unabhängig davon, welches Objekt Sie erhalten, kann es X und Y ausführen." Wie bereits geschrieben, funktioniert Ihre Schnittstelle weder mit X noch mit Y, da garantiert wird , dass ein Stapelüberlauf auftritt.
Das Auslösen eines Fehlers oder einer Unterklasse weist auf einen schwerwiegenden Fehler hin, der nicht abgefangen werden sollte:
Ein Fehler ist eine Unterklasse von Throwable, die auf schwerwiegende Probleme hinweist, die eine vernünftige Anwendung nicht abfangen sollte.
Darüber hinaus VirtualMachineError , die Elternklasse von Stackoverflow , sagt dieser:
Wird ausgelöst, um anzuzeigen, dass die Java Virtual Machine defekt ist oder nicht mehr genügend Ressourcen zur Verfügung stehen, um den Betrieb fortzusetzen.
Ihr Programm sollte sich nicht mit JVM-Ressourcen befassen . Das ist die Aufgabe der JVM. Das Erstellen eines Programms, das im Rahmen des normalen Betriebs einen JVM-Fehler verursacht, ist fehlerhaft. Entweder wird garantiert, dass Ihr Programm abstürzt, oder die Benutzer dieser Schnittstelle werden gezwungen, Fehler abzufangen, mit denen sie sich nicht befassen sollten.
Vielleicht kennen Sie Eric Lippert von solchen Bemühungen als emeritiertes "Mitglied des C # -Sprachdesign-Komitees". Er spricht über Sprachmerkmale, die Menschen zum Erfolg oder Misserfolg bewegen: Während dies kein Sprachmerkmal oder Teil des Sprachdesigns ist, gilt sein Standpunkt ebenso für die Implementierung von Schnittstellen oder die Verwendung von Objekten.
Erinnern Sie sich an The Princess Bride, als Westley aufwacht und mit einem heiseren Albino und dem finsteren Sechsfinger-Mann, Graf Rugen, in The Pit Of Despair gefangen ist? Die Grundidee einer Grube der Verzweiflung ist zweifach. Erstens, dass es eine Grube ist und daher leicht zu fallen ist, aber schwierig zu überwinden ist. Und zweitens, dass es Verzweiflung auslöst. Daher der Name.
Quelle: C ++ und die Grube der Verzweiflung
Wenn ein Interface StackOverflowError
standardmäßig einen wirft, werden die Entwickler in die Grube der Verzweiflung gedrängt und es ist eine schlechte Idee . Schieben Sie die Entwickler stattdessen in Richtung Pit of Success . Machen Sie es einfach Ihre Schnittstelle richtig zu verwenden und ohne die JVM abstürzt.
Das Delegieren zwischen den Methoden ist hier in Ordnung. Die Abhängigkeit sollte jedoch in eine Richtung gehen. Ich stelle mir Methodendelegation gerne als gerichteten Graphen vor . Jede Methode ist ein Knoten im Diagramm. Zeichnen Sie jedes Mal, wenn eine Methode eine andere Methode aufruft, eine Kante von der aufrufenden Methode zu der aufgerufenen Methode.
Wenn Sie ein Diagramm zeichnen und feststellen, dass es zyklisch ist, ist das ein Codegeruch. Das ist ein Potenzial, um Entwickler in die Grube der Verzweiflung zu drängen. Beachten Sie, dass es nicht grundsätzlich verboten sein sollte, nur dass man Vorsicht walten lassen muss . Rekursive Algorithmen haben speziell Zyklen im Aufrufdiagramm: das ist in Ordnung. Dokumentieren Sie es und warnen Sie die Entwickler. Wenn es nicht rekursiv ist, versuchen Sie, diesen Zyklus zu unterbrechen. Wenn dies nicht möglich ist, ermitteln Sie, welche Eingaben einen Stapelüberlauf verursachen können, und verringern Sie diese oder dokumentieren Sie sie als letzten Fall, wenn sonst nichts funktioniert.