Hintergrund
Alle Java-Objekte verfügen über eine toString()
Methode, die aufgerufen wird, wenn Sie versuchen, das Objekt zu drucken.
System.out.println(myObject); // invokes myObject.toString()
Diese Methode wird in der Object
Klasse definiert (der Oberklasse aller Java-Objekte). Die Object.toString()
Methode gibt eine ziemlich hässlich aussehende Zeichenfolge zurück, die aus dem Namen der Klasse, einem @
Symbol und dem Hashcode des Objekts hexadezimal besteht. Der Code dafür sieht so aus:
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Ein Ergebnis wie com.foo.MyType@2f92e0f4
kann daher erklärt werden als:
com.foo.MyType
- Der Name der Klasse, dh die Klasse befindet sich MyType
im Paket com.foo
.
@
- verbindet die Zeichenfolge miteinander
2f92e0f4
der Hashcode des Objekts.
Der Name der Array-Klassen sieht etwas anders aus, was in den Javadocs für gut erklärt wird Class.getName()
. Zum Beispiel [Ljava.lang.String
bedeutet:
[
- ein eindimensionales Array (im Gegensatz zu [[
oder [[[
usw.)
L
- Das Array enthält eine Klasse oder Schnittstelle
java.lang.String
- die Art der Objekte im Array
Anpassen der Ausgabe
Um beim Aufruf etwas anderes zu drucken System.out.println(myObject)
, müssen Sie die Methode in Ihrer eigenen Klasse überschreibentoString()
. Hier ist ein einfaches Beispiel:
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
Wenn wir nun a drucken Person
, sehen wir eher ihren Namen als com.foo.Person@12345678
.
Beachten Sie, dass dies toString()
nur eine Möglichkeit ist, ein Objekt in eine Zeichenfolge zu konvertieren. In der Regel sollte diese Ausgabe Ihr Objekt klar und präzise beschreiben. Ein besseres toString()
für unsere Person
Klasse könnte sein:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
Welches würde drucken, z Person[name=Henry]
. Das sind wirklich nützliche Daten zum Debuggen / Testen.
Wenn Sie sich nur auf einen Aspekt Ihres Objekts konzentrieren oder viel jazzige Formatierung verwenden möchten, ist es möglicherweise besser, stattdessen eine separate Methode zu definieren, z String toElegantReport() {...}
.
Ausgabe automatisch generieren
Viele IDEs bieten Unterstützung für die automatische Generierung einer toString()
Methode basierend auf den Feldern in der Klasse. Siehe zum Beispiel Dokumente für Eclipse und IntelliJ .
Einige beliebte Java-Bibliotheken bieten diese Funktion ebenfalls an. Einige Beispiele sind:
Drucken von Objektgruppen
Sie haben also ein schönes toString()
für Ihre Klasse erstellt. Was passiert, wenn diese Klasse in ein Array oder eine Sammlung eingefügt wird?
Arrays
Wenn Sie ein Array von Objekten haben, können Sie aufrufen Arrays.toString()
, um eine einfache Darstellung des Inhalts des Arrays zu erstellen. Betrachten Sie beispielsweise dieses Array von Person
Objekten:
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
Hinweis: Dies ist ein Aufruf einer statischen Methode, die toString()
in der Arrays-Klasse aufgerufen wird und sich von der oben beschriebenen unterscheidet.
Wenn Sie ein mehrdimensionales Array haben , können Sie Arrays.deepToString()
dieselbe Art von Ausgabe erzielen.
Sammlungen
Die meisten Sammlungen erzeugen eine hübsche Ausgabe, wenn .toString()
jedes Element aufgerufen wird.
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
Sie müssen also nur sicherstellen, dass Ihre Listenelemente ein schönes definieren, toString()
wie oben beschrieben.