Hvordan udskriver jeg mit Java-objekt uden at blive [e-mailbeskyttet]?
Baggrund
Alle Java-objekter har en toString()
metode, som aktiveres, når du forsøger at udskrive objektet.
System.out.println(myObject); // invokes myObject.toString()
Denne metode er defineret i Object
klasse (superklassen af alle Java-objekter). Object.toString()
metoden returnerer en streng, der ser ret grimt ud, sammensat af navnet på klassen, en @
symbol og objektets hashkode i hexadecimal. Koden til dette ser sådan ud:
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Et resultat såsom [email protected]
kan derfor forklares som:
com.foo.MyType
- navnet på klassen, dvs. klassen erMyType
i pakkencom.foo
.@
- binder strengen sammen2f92e0f4
objektets hashkode.
Navnet på array-klasser ser lidt anderledes ud, hvilket er forklaret godt i Javadocs for Class.getName()
. For eksempel [Ljava.lang.String
betyder:
[
- et enkeltdimensionelt array (i modsætning til[[
eller[[[
osv.)L
- arrayet indeholder en klasse eller grænsefladejava.lang.String
- typen af objekter i arrayet
Tilpasning af output
At udskrive noget andet, når du ringer til System.out.println(myObject)
, skal du tilsidesætte toString()
metode i din egen klasse. Her er et simpelt eksempel:
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
Hvis vi nu udskriver en Person
, ser vi deres navn i stedet for [email protected]
.
Husk at toString()
er kun én måde for et objekt at blive konverteret til en streng. Typisk skal dette output fuldt ud beskrive dit objekt på en klar og kortfattet måde. En bedre toString()
for vores Person
klasse kan være:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
Hvilket ville udskrive, f.eks. Person[name=Henry]
. Det er et virkelig nyttigt stykke data til fejlretning/testning.
Hvis du kun vil fokusere på ét aspekt af dit objekt eller inkludere en masse jazzet formatering, er det måske bedre at definere en separat metode i stedet, f.eks. String toElegantReport() {...}
.
Auto-generering af output
Mange IDE'er tilbyder understøttelse af automatisk generering af en toString()
metode, baseret på felterne i klassen. Se f.eks. dokumenter for Eclipse og IntelliJ.
Flere populære Java-biblioteker tilbyder også denne funktion. Nogle eksempler omfatter:
-
ToStringBuilder
fra Apache Commons Lang -
MoreObjects.ToStringHelper
fra Google Guava -
@ToString
annotation fra Project Lombok
Udskrivning af grupper af objekter
Så du har lavet en flot toString()
for din klasse. Hvad sker der, hvis den klasse placeres i et array eller en samling?
Arrays
Hvis du har en række objekter, kan du ringe til Arrays.toString()
at producere en simpel repræsentation af indholdet af arrayet. Overvej f.eks. denne matrix af Person
objekter:
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
Bemærk:dette er et opkald til en statisk metode kaldet toString()
i Arrays-klassen, som er anderledes end det, vi har diskuteret ovenfor.
Hvis du har en multidimensional matrix , kan du bruge Arrays.deepToString()
for at opnå den samme slags output.
Samlinger
De fleste samlinger vil producere et smukt output baseret på at kalde .toString()
på hvert element.
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
Så du skal bare sikre dig, at dine listeelementer definerer en god toString()
som diskuteret ovenfor.
Jeg tror, at apache giver en bedre util-klasse, som giver en funktion til at hente strengen
ReflectionToStringBuilder.toString(object)
Hver klasse i Java har toString()
metode i den som standard, som kaldes, hvis du sender et objekt af den klasse til System.out.println()
. Som standard returnerer dette kald [email protected] for det pågældende objekt.
{
SomeClass sc = new SomeClass();
// Class @ followed by hashcode of object in Hexadecimal
System.out.println(sc);
}
Du kan tilsidesætte toString-metoden for en klasse for at få et andet output. Se dette eksempel
class A {
String s = "I am just a object";
@Override
public String toString()
{
return s;
}
}
class B {
public static void main(String args[])
{
A obj = new A();
System.out.println(obj);
}
}