Java >> Java tutorial >  >> Tag >> protected

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 er MyType i pakken com.foo .
  • @ - binder strengen sammen
  • 2f92e0f4 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ænseflade
  • java.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);
    }
}

Java tag