Ich habe ein Entwurfsproblem in einem gemeinsamen Dienstprogramm, das wir in unserem Java-Projekt verwenden, um sicherzustellen, dass alle Aufrufer einer bestimmten Methode A von einer anderen Methode B umschlossen werden. die allgemeine Form dieses Codes, wie ich es heute geschrieben habe, ist:Sicherstellen, dass der Aufrufstapel einer Methode immer eine andere Methode in Java enthält
x.B(new Runnable() {
y.A();
});
die runnable dass durch B ausgeführt wird, beliebigen Code haben kann, und rufen kann ein mehrfach, so kann ich nicht loswerden Die Runnable in diesem Code durch Hinzufügen des Aufrufs zu A direkt in B. Auch A ist Code von Drittanbietern, so dass wir es nicht ändern können. Es ist möglich, dass der Runnable B mit einem weiteren verschachtelten Aufruf von A erneut aufrufen könnte, aber heute passiert das nie, also bin ich in Ordnung, diesen Fall für jetzt zu ignorieren.
Ich sehe ein paar Optionen:
A() throws BlahException
erklären und machen es so, dass B die einzige Fänger dieser Ausnahme ist. Das ist hässlich, weil es keine Ausnahme gibt, die wirklich geworfen werden sollte, aber es ist nett, weil der Compiler die Aufrufhierarchie für mich sicherstellen würde.- Schreiben Sie eine Art statische Analyse-Tool, um diese Regel für mich zu gewährleisten. Ich habe diesen Fall noch nicht viel untersucht, da es mehr Arbeit als alles andere zu sein scheint (aber vielleicht gibt es ein bereits existierendes Werkzeug, das das kann?).
- Fügen Sie dem "Anfang von A" eine Behauptung hinzu (wirklich, dieser Code müsste in einer benutzerdefinierten Version von Runnble leben, da ich A nicht direkt ändern kann), die wir innerhalb eines Anrufs zu B führen. Dies könnte Verwenden Sie entweder einen zusätzlichen Thread-/Objekt-Local-Status oder durchqueren Sie den Call-Stack selbst. Beide sind ziemlich hässlich.
Gibt es andere Optionen, die ich nicht berücksichtigt habe?
Dies ist sehr ein Anti-Muster. Methode 'A' sollte sich nicht darum kümmern, wer sie angerufen hat. Warum denkst du, dass du das tun musst? –
Haben Sie versucht, das Proxy-Muster zu verwenden? – MaxZoom
@KevinKrumwiede - Es ist möglich, dass sowohl "A" von seinem Aufrufer unabhängig ist als auch das Projekt, dass alle Aufrufe von 'A' umschlossen werden sollen. –