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 Object
classe (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@2f92e0f4
può quindi essere spiegato come:
com.foo.MyType
- il nome della classe, ovvero la classe è MyType
nel 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.String
significa:
[
- 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 Person
classe 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 Person
oggetti:
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.