Il metodo toString() è un metodo standard della classe Object in Java che consente di ottenere una rappresentazione in forma di stringa di un oggetto. Storicamente, è stato introdotto per aiutare nel debug e nella registrazione, in modo che anziché visualizzare informazioni tecniche su un oggetto (ClassName@hashCode), fosse possibile ottenere una descrizione significativa e leggibile.
Inizialmente, se non si sovrascrive toString(), il metodo restituisce una stringa del tipo nome_classe@hash_code. Questo è scomodo per comprendere o visualizzare lo stato dell'oggetto. Pertanto, la sovrascrittura di toString() è diventata una buona pratica.
Senza un'implementazione chiara di toString(), il debug e la registrazione degli oggetti sono complicati. È difficile capire cosa contiene esattamente un oggetto senza conoscere la sua struttura interna o i valori correnti dei campi.
Una corretta sovrascrittura di toString() consente:
Esempio di codice:
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } }
Caratteristiche chiave:
È sempre obbligatorio sovrascrivere il metodo toString() in tutte le classi?
No, non è obbligatorio, ma è estremamente consigliato sovrascriverlo nelle classi i cui oggetti vengono frequentemente visualizzati nei log o utilizzati per il debug.
Può il metodo toString() lanciare eccezioni?
Tecnicamente sì, se all'interno del metodo si verifica, ad esempio, un NullPointerException accedendo a un campo senza verificare che sia nullo. Ma la buona pratica è evitarlo, in modo che toString() restituisca sempre una stringa corretta.
È obbligatorio invocare toString() esplicitamente?
No, il compilatore lo invoca implicitamente durante la concatenazione dell'oggetto con una stringa o durante la visualizzazione dell'oggetto tramite System.out.println.
Person p = new Person("Ivan", 25); System.out.println(p); // Invoca automaticamente p.toString()
Un programmatore non sovrascrive toString() nella classe User e scrive nei log:
log.info(user);
Pro:
Contro:
User@1a2b3c, senza informazioni sull'utente.Un programmatore sovrascrive toString():
@Override public String toString() { return "User{name='" + name + "', id=" + id + "}"; }
Pro:
Contro: