2013-06-05 15 views
10

Ho un grande progetto con una classe che è ampiamente utilizzato in tutto il mondo all'interno di questo progetto. Questa classe definisce il metodo toString() che emette molte informazioni. Voglio definire un altro metodo, diciamo, toShortString() e sostituire tutte le occorrenze in cui originale toString() viene chiamato con questo metodo di chiamata.Trova tutti gli usi di metodo toString()

Il problema è che c'è un sacco di codice che appare come segue:

log.debug("Order issued: " + order); 
log.debug("Loaded list of orders: " + orders); 

dove order è istanza di questo oggetto e orders è un elenco di tali oggetti.

Esiste un modo per trovare tutti tali eventi?

Qualsiasi suggerimento è benvenuto. IDE è IntelliJ Idea, se è importante.

+1

Si desidera sostituire completamente le chiamate 'toString()' con chiamate 'toShortString()' per determinati oggetti? Quegli oggetti sono tuoi? Non puoi semplicemente sovrascrivere 'toString()'? C'è qualche possibilità di tornare all'attuale implementazione di 'toString()'? – Gamb

+0

Questo problema aperto sul backlog intellij sembra descrivere ciò che stai cercando: http://youtrack.jetbrains.com/issue/IDEABKL-3992 –

+1

Non potrai semplicemente sostituire gli ordini 'orders' con'. toShortString'. –

risposta

3

È sufficiente eseguire l'override del corpo toString() metodo nella classe Order.

Tecnicamente non è possibile trovare tutte le chiamate, perché anche le librerie di sistema chiamano toString() in molti luoghi, come in tutti i tipi di raccolte. Inoltre si dovrebbe prestare attenzione ai vostri modelli (qualunque interfaccia grafica che si sta utilizzando.)

Quindi, si vuole registro breve stampa, e il debug il pieno (l'originale). Entrambi stanno chiamando toString(). Quindi potresti provare a sbirciare all'interno della traccia dello stack chiamante per decidere da dove viene chiamato. Utilizzare Thread.currentThread().getStackTrace() per accedere alla traccia dello stack corrente.

Supponiamo che, se uno degli ultimi 10 elementi di stacktrace appartiene alla classe Log, viene chiamato per la registrazione, quindi è possibile stampare la stampa breve. Altrimenti fare la stampa completa.

Sì, è buona norma spostare le diverse versioni di toString() in metodi separati.

+0

In questo caso perderò informazioni sullo stato di questo oggetto nel debugger che non è quello che mi piacerebbe accadere. –

+0

Penso che lo * stato * non vada perso, solo che per questo si ottiene una stampa diversa. Non ho familiarità con Idea, ma in Eclipse è possibile definire una visualizzazione per una determinata classe, probabilmente anche in Idea c'è un modo simile. – gaborsch

+0

Grazie per la risposta, continuerò a cambiare il metodo 'toString()'. –

4

Invece di sostituire tutte le occorrenze di toString() che sarebbe soggetto a errori (si sarebbe sicuramente perdere alcuni) e alcuni davvero difficile da sostituire (per esempio, il System.out.println() su un List di Order oggetti sarebbe sempre richiamare toString() solo) Suggerisco si modifica il toString() stesso a chiamare toShortString().

Spostare tutto il codice all'interno toString() ad un'altra funzione chiamata toLongString() e quindi utilizzare questa funzione in cui si sente il bisogno di avere una dettagliata rappresentazione di StringOrder oggetti.

+0

Grazie per la risposta, continuerò a cambiare il metodo 'toString()'. –

0

So di essere un po 'in ritardo, ma ho trovato un modo legittimo di fare questo in IDEA:

  1. Dentro il tuo marchio di classe toString metodo @Deprecated.
  2. Analyze ->Run inspection by name -> selezionare Deprecated API usage.

Viola!Elencherà tutti gli usi di tutte le API deprecate (si spera che tu non lo faccia) che ovviamente include lo toString che hai appena annotato. Non dimenticare di rimuovere l'annotazione.

P.S. non mostrerà chiamate implicite anche se

Problemi correlati