2012-05-15 7 views
7

Ich bin im Moment mit folgendem Problem konfrontiert:Gibt es eine Möglichkeit, alle Aufrufe von equals() einer bestimmten Klasse mit Eclipse aufzulisten?

Ich habe eine bestimmte Klasse, in der die equals() - Methode überschrieben wird. Ich bin mir jedoch nicht sicher, ob es jemals benutzt wird (entweder in meinem oder in einem meiner Kollegenprojekte). Gibt es einen Weg, das herauszufinden? Wenn ich nach Referenzen suche, nun, gibt es mir ALLE Referenzen auf die Object equals() - Methode (das sind einige). Es muss sicherlich einen einfacheren Weg geben, als alle zu scannen ...

Wer hat eine Idee?

Antwort

1

Ich kann mir keine Methode vorstellen, die das rein durch statische Analyse zuverlässig tun würde (ich bezweifle, dass es eine gibt).

Eine praktische Methode, die könnte Hilfe einen Haltepunkt in der ersten Zeile des equals() Verfahrens einzustellen ist, und das Programm in den Eclipse-Debugger starten. Wenn die Methode aufgerufen wird, wird Eclipse in den Debugger einbrechen. An diesem Punkt können Sie den Aufruf-Stack untersuchen, um zu sehen, wer die Methode aufgerufen hat.

Um dies effektiv zu tun, müssten Sie eine Vorstellung davon haben, welche Codepfade die Methode erwarten können. Wenn Sie die Methode nicht auslösen können, beweist dies nicht, dass niemand sie verwendet.

+2

Und was dann? Execute _jeder mögliche Code path_ im Debug-Modus? – Asaph

+0

@Asaph: Mit Respekt, Sie sind sehr willkommen, bessere Vorschläge zu posten. – NPE

+1

Ich ging, aber ich denke, dass @aioobe die Antwort hat (was es nicht tun kann). Ich habe seine Antwort aufgewertet. – Asaph

5

Sie bitten Eclipse, eine unmögliche Aufgabe zu lösen.

Um herauszufinden, ob eine bestimmte überschriebene Methode aufgerufen wird oder nicht, ist statisch entscheidbar, weshalb Eclipse über die Antwort näherungsweise.

Angenommen, Sie haben ein Feld Object o und Sie tun irgendwann o.equals(...). Um zu bestimmen, ob o jemals auf ein Objekt,verweisen kann, müssen Sie den Laufzeittyp o über jeden möglichen Ausführungspfad bestimmen, der einfach nicht statisch ausgeführt werden kann.

Der Grund, warum es unmöglich ist, ist ziemlich ähnlich, warum der Compiler den folgenden Code ablehnt:

Object o = "hello"; 
System.out.println(o.length()); 

Das Beste, was Sie wahrscheinlich tun können, ist Ihr Programm debuggen, entweder durch einen Haltepunkt setzen oder durch das Werfen Zum Beispiel eine UnsupportedOperationException innerhalb der equals-Methode.

+0

Ich denke, die Frage war über Referencies in den Workspace-Projekten, nicht Laufzeitaufrufe –

+1

So interpretierte ich die Frage auch. – aioobe

+0

ah ich sehe; Wenn ich jedoch einen überschriebenen Aufruf von equals() in einer Klasse hilitiere und F3 drücke, springt Eclipse korrekt zur übergeordneten Methodendefinition, nicht zu Objects equals(). Warum konnte das nicht für jede Datei im Arbeitsbereich wiederholt werden? –

1

Wählen Sie Methodenname in Eclipse -> Package Explorer oder Gliederungsansicht und klicken Sie auf F4. Alternativ können Sie Methode auswählen -> Rechtsklick -> Aufrufhierarchie öffnen
Dies zeigt alle Mitglieder, die diese Methode in Ihrem Arbeitsbereich aufrufen. this helps

1

Was ist das überschriebene Modifizierung gleich zu so etwas wie:

log.debug // Whatever you want 
return this == obj; 

Welche Sie geben das klassische Objekt gleich? Oder vielleicht ein super.equals, wenn Sie eine Klasse erweitern?

1

Scheint, dass Java in dieser Hinsicht gebrochen ist. Also musst du es auf die harte Tour machen und hoffen, alle Vorkommnisse zu erfassen.

  • eine Kopie Ihrer Klasse erstellen
  • die alte Klasse durch die Umbenennung einer nach dem anderen
  • Fix alle Compiler-Fehler löschen.
  • Suchen Sie nach Vorkommen, wo die Klasse als Schlüssel für Karten verwendet wird
  • Geben Sie für Sammlungen der Klasse (indexOf(),() enthält)
  • Geben Sie für Anrufe equals() oder hashCode() der Klasse
  • Hoffe, dass Sie etwas nicht verpassen
Verwandte Themen