sfondo
Tutti gli oggetti Java hanno un toString()metodo, che viene invocato quando si tenta di stampare l'oggetto.
System.out.println(myObject); // invokes myObject.toString()
Questo metodo è definito nella Objectclasse (la superclasse di tutti gli oggetti Java). Il Object.toString()metodo restituisce una stringa dall'aspetto piuttosto brutto, composta dal nome della classe, un @simbolo e l' hashcode dell'oggetto in esadecimale. Il codice per questo sembra:
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Un risultato come quello com.foo.MyType@2f92e0f4può quindi essere spiegato come:
com.foo.MyType - il nome della classe, ovvero la classe è MyTypenel pacchetto com.foo.
@ - unisce la stringa
2f92e0f4 l'hashcode dell'oggetto.
Il nome delle classi di array ha un aspetto leggermente diverso, il che è spiegato bene nel Javadocs Class.getName(). Ad esempio, [Ljava.lang.Stringsignifica:
[- una matrice monodimensionale (al contrario [[o [[[ecc.)
L - l'array contiene una classe o un'interfaccia
java.lang.String - il tipo di oggetti nella matrice
Personalizzazione dell'output
Per stampare qualcosa di diverso quando chiami System.out.println(myObject), devi sovrascrivere il toString()metodo nella tua classe. Ecco un semplice esempio:
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
Ora se stampiamo un Person, vediamo il loro nome piuttosto che com.foo.Person@12345678.
Tieni presente che toString()è solo un modo per convertire un oggetto in una stringa. In genere questo output dovrebbe descrivere completamente il tuo oggetto in modo chiaro e conciso. Un migliore toString()per la nostra Personclasse potrebbe essere:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
Che verrebbe stampato, ad es Person[name=Henry]. È un dato davvero utile per il debugging / testing.
Se vuoi concentrarti su un solo aspetto del tuo oggetto o includere molta formattazione jazz, potresti invece preferire definire un metodo separato, ad es String toElegantReport() {...}.
Generazione automatica dell'uscita
Molti IDE offrono supporto per la generazione automatica di un toString()metodo, basato sui campi della classe. Vedi i documenti per Eclipse e IntelliJ , per esempio.
Diverse librerie Java popolari offrono anche questa funzione. Alcuni esempi includono:
Stampa di gruppi di oggetti
Quindi hai creato un bello toString()per la tua classe. Cosa succede se quella classe viene inserita in un array o in una raccolta?
Array
Se si dispone di una matrice di oggetti, è possibile chiamare Arrays.toString()per produrre una semplice rappresentazione del contenuto della matrice. Ad esempio, considera questo array di Personoggetti:
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
Nota: questa è una chiamata a un metodo statico chiamato toString()nella classe Arrays, che è diverso da quello di cui abbiamo discusso in precedenza.
Se si dispone di un array multidimensionale , è possibile utilizzare Arrays.deepToString()per ottenere lo stesso tipo di output.
collezioni
La maggior parte delle raccolte produrrà un output piuttosto basato sulla chiamata .toString()su ogni elemento.
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
Quindi devi solo assicurarti che gli elementi della tua lista definiscano un aspetto gradevole toString()come discusso sopra.