2012-05-15 28 views
7

Me enfrento con el siguiente problema en este momento:¿Hay alguna forma de enumerar todas las llamadas de iguales() de una determinada clase con Eclipse?

Tengo una cierta clase en la cual se reemplaza el método equals() -. Sin embargo, no estoy seguro de si alguna vez se utilizará (en mi proyecto o en uno de mis colegas). ¿Hay una manera de averiguarlo? Cuando busco referencias, bueno, me da TODAS las referencias al Object equals() - Method (que son bastantes). Seguramente debe haber una manera más fácil que escanear a través de todos ellos ...

¿Alguien tiene una idea?

Respuesta

1

No puedo pensar en un método que pueda hacer esto de manera confiable a través del análisis estático (dudo que exista).

Un método práctico que podría ayuda es establecer un punto de interrupción en la primera línea del método equals(), e iniciar el programa en el depurador de Eclipse. Siempre que se llame al método, Eclipse irrumpirá en el depurador. En este punto, podrás examinar la pila de llamadas para ver quién llamó al método.

Para hacer esto de manera efectiva, debe tener alguna idea de qué rutas de código se puede esperar para llamar al método. Si no puede activar el método, esto no prueba que nadie lo usa.

+2

¿Y luego qué? Ejecutar _every ruta de código posible_ en modo de depuración? – Asaph

+0

@Asaph: con todo respeto, le invitamos a que envíe mejores sugerencias. – NPE

+1

Iba a ir, pero creo que @aioobe tiene la respuesta (que es que no se puede hacer). Volví a subir su respuesta. – Asaph

5

Le está pidiendo a Eclipse que resuelva una tarea imposible.

Para averiguar si se llama o no un método reemplazado en particular no es decible estáticamente, por lo que Eclipse se aproxima a la respuesta.

Supongamos que tiene algún campo Object o y que en algún momento hace o.equals(...). Para determinar si o podría alguna vez referirse a un objeto YourClass, es necesario que determine el tipo de tiempo de ejecución de o a lo largo de cada ruta de ejecución posible, que simplemente no se puede hacer de forma estática.

La razón por la que es imposible es bastante similar a la razón por la que el compilador rechaza el siguiente código:

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

Lo mejor que puede hacer es, probablemente, depurar el programa, ya sea mediante el establecimiento de un punto de ruptura o exponiéndola por ejemplo, UnsupportedOperationException dentro del método equals.

+0

Creo que la pregunta se refería a las referencias en los proyectos del espacio de trabajo, no a las llamadas en tiempo de ejecución –

+1

Así interpreté la pregunta también. – aioobe

+0

ah veo; pero si utilizo una invocación equals() anulada en una clase y presiono F3, eclipse corre directamente a la definición del método principal, no Objects equals(). Entonces, ¿por qué no podría repetirse en cada archivo en el espacio de trabajo? –

1

Seleccione el nombre del método en Eclipse -> Explorador de paquetes o Vista de esquema y haga clic en F4. Como alternativa, puede seleccionar el método -> clic derecho -> Abrir jerarquía de llamadas
Esto mostrará a todos los miembros que llamen a este método en su área de trabajo. Esperanza esto ayuda

1

Qué acerca de cómo modificar el sobrescrito es igual a algo como:

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

que le dan el clásico objeto es igual? O tal vez un super.equals si amplías alguna clase?

1

Parece que Java está roto en ese sentido. Entonces debes hacerlo de la manera difícil y esperar atrapar todas las ocurrencias.

  • Crear una copia de su clase
  • Eliminar la vieja clase
  • Corregir todos los errores del compilador-cambiando el nombre de uno en uno.
  • Busque sucesos en los que se utiliza la clase como clave para mapas
  • Buscar las colecciones de la clase (indexOf(), contiene())
  • Buscar las llamadas a los iguales() o hashCode() de la clase
  • Espero que no se haya perdido algo
Cuestiones relacionadas