Wie verwende ich die toString-Methode in Java?

118

Kann mir jemand das toString()in der ObjectKlasse definierte Konzept der Methode erklären ? Wie wird es verwendet und wozu dient es?

David Brown
quelle
Hier ist auch ein schneller Trick / eine schnelle Implementierung: @Override public String toString () {return org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString (this); }
GranadaCoder

Antworten:

81

Aus den Object.toStringDokumenten:

Gibt eine Zeichenfolgendarstellung des Objekts zurück. Im Allgemeinen gibt die toString Methode eine Zeichenfolge zurück, die dieses Objekt "textuell darstellt". Das Ergebnis sollte eine präzise, ​​aber informative Darstellung sein, die für eine Person leicht zu lesen ist. Es wird empfohlen, dass alle Unterklassen diese Methode überschreiben.

Die toStringMethode für die Klasse Object gibt eine Zeichenfolge zurück, die aus dem Namen der Klasse, deren Instanz das Objekt ist, dem Vorzeichen "@" und der vorzeichenlosen hexadezimalen Darstellung des Hash-Codes des Objekts besteht. Mit anderen Worten, diese Methode gibt eine Zeichenfolge zurück, die dem Wert von:

getClass().getName() + '@' + Integer.toHexString(hashCode())

Beispiel:

String[] mystr ={"a","b","c"};
System.out.println("mystr.toString: " + mystr.toString());

output:- mystr.toString: [Ljava.lang.String;@13aaa14a
Sean Patrick Floyd
quelle
1
Der Hauptzweck besteht darin, es in Unterklassen zu überschreiben. Ich denke, Antworten von @stephen und Andreas_D sind besser als akzeptierte Antworten.
Sree Rama
39

Verwendung der String.toString:

Wann immer Sie den Konstruktor namens value im StringFormular untersuchen müssen, können Sie einfach String.toString... als Beispiel ... verwenden.

package pack1;

import java.util.*;

class Bank {

    String n;
    String add;
    int an;
    int bal;
    int dep;

    public Bank(String n, String add, int an, int bal) {

        this.add = add;
        this.bal = bal;
        this.an = an;
        this.n = n;

    }

    public String toString() {
        return "Name of the customer.:" + this.n + ",, "
                + "Address of the customer.:" + this.add + ",, " + "A/c no..:"
                + this.an + ",, " + "Balance in A/c..:" + this.bal;
    }
}

public class Demo2 {

    public static void main(String[] args) {

        List<Bank> l = new LinkedList<Bank>();

        Bank b1 = new Bank("naseem1", "Darbhanga,bihar", 123, 1000);
        Bank b2 = new Bank("naseem2", "patna,bihar", 124, 1500);
        Bank b3 = new Bank("naseem3", "madhubani,bihar", 125, 1600);
        Bank b4 = new Bank("naseem4", "samastipur,bihar", 126, 1700);
        Bank b5 = new Bank("naseem5", "muzafferpur,bihar", 127, 1800);
        l.add(b1);
        l.add(b2);
        l.add(b3);
        l.add(b4);
        l.add(b5);
        Iterator<Bank> i = l.iterator();
        while (i.hasNext()) {
            System.out.println(i.next());
        }
    }

}

... kopieren Sie dieses Programm in Ihre Eclipse und führen Sie es aus ... Sie erhalten die Ideen zu String.toString...

Naseem Afzal
quelle
5
Ich hoffe, Sie wissen, dass dies toStringnicht beabsichtigt und nicht für Benutzeroberflächenzwecke geeignet ist.
Powerslave
@Powerslave erklärt dann, warum alle Swing-Komponenten toStringein Objekt in der GUI anzeigen? Wenn ich ein umfangreiches Objekt habe und es in einer GUI anzeigen möchte, nein, ich erstelle weder einen zusätzlichen Renderer dafür, noch extrahiere ich eine Zeichenfolgeeigenschaft aus dem Objekt, um diese in der GUI zu verwenden. Ich behalte sie einfach und umsetzbar toString, um all diesen Aufwand umgehen zu können. Wenn Sie dies sauberer tun möchten, erstellen Sie eine Wrapper-Klasse, die für Benutzeroberflächenzwecke vorgesehen ist, und implementieren ihre toStringMethode, um eine Zeichenfolgeeigenschaft des Wrappees zurückzugeben.
Timmos
1
@Timmos Wenn deine Freunde von einer Brücke springen würden, würdest du folgen? Nur weil die Swing-Entwickler die toString-Funktion verwenden (lesen; missbrauchen), heißt das nicht, dass Sie dies auch tun sollten.
Toby Caulk
2
Dies ist bei weitem der einfachste Ansatz, um die Arbeit zu erledigen, da Sie weiterhin die Standard-Swing-API verwenden. Wenn Sie ein benutzerdefiniertes Rendering wünschen, installieren Sie einen benutzerdefinierten Renderer auf Ihrer Komponente. Wenn Sie nur ein Objekt anzeigen möchten, das durch einen String dargestellt wird, ist die Implementierung von toString () viel einfacher als bei einem benutzerdefinierten Renderer, der alle möglichen Fallstricke aufweist, um es richtig zu machen. Ich finde Ihren Vergleich mit dem Abspringen von einer Brücke seltsam.
Timmos
35

Die toString()Methode gibt eine Textdarstellung eines Objekts zurück. Eine grundlegende Implementierung ist bereits enthalten, java.lang.Objectund da alle Objekte davon erben java.lang.Object, ist garantiert, dass jedes Objekt in Java über diese Methode verfügt.

Das Überschreiben der Methode ist immer eine gute Idee, insbesondere beim Debuggen, da Debugger häufig Objekte anhand des Ergebnisses der toString()Methode anzeigen. Verwenden Sie also eine sinnvolle Implementierung, aber verwenden Sie sie für technische Zwecke. Die Anwendungslogik sollte Getter verwenden:

public class Contact {
  private String firstName;
  private String lastName;
  public Contact (String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  public String getFirstName() {return firstName;}
  public String getLastName() {return lastName;}

  public String getContact() {
    return firstName + " " + lastName;
  }

  @Override
  public String toString() {
    return "["+getContact()+"]";
  }
}
Andreas Dolk
quelle
14

Es kann optional im Kontext einer Anwendung verwendet werden, wird jedoch weitaus häufiger für Debugging-Zwecke verwendet. Wenn Sie beispielsweise einen Haltepunkt in einer IDE erreichen, ist es viel einfacher, aussagekräftige toString()Objekte zu lesen, als deren Mitglieder zu untersuchen.

Es gibt keine festgelegten Anforderungen für die toString()Vorgehensweise einer Methode. Konventionell werden Ihnen meistens der Name der Klasse und der Wert der relevanten Datenelemente angezeigt. Meistens werden toString()Methoden in IDEs automatisch generiert.

toString()Es ist eine schlechte Idee, sich auf eine bestimmte Ausgabe einer Methode zu verlassen oder sie innerhalb eines Programms zu analysieren. Was auch immer Sie tun, gehen Sie diesen Weg nicht.

Cletus
quelle
2
Könnten Sie Ihre letzte Aussage näher erläutern?
Jean-Philippe Caruana
13

toString () gibt eine Zeichenfolge / Textdarstellung des Objekts zurück. Die toString () -Methode wird häufig für Diagnosezwecke wie Debuggen, Protokollieren usw. verwendet, um wichtige Details zum Objekt zu lesen.

Es wird automatisch aufgerufen, wenn das Objekt an println, print, printf, String.format (), assert oder den String-Verkettungsoperator übergeben wird.

Die Standardimplementierung von toString () in der Klasse Object gibt eine Zeichenfolge zurück, die aus dem Klassennamen dieses Objekts gefolgt von @ sign und der vorzeichenlosen hexadezimalen Darstellung des Hashcodes dieses Objekts unter Verwendung der folgenden Logik besteht:

getClass().getName() + "@" + Integer.toHexString(hashCode())

Zum Beispiel das Folgende

public final class Coordinates {

    private final double x;
    private final double y;

    public Coordinates(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public static void main(String[] args) {
        Coordinates coordinates = new Coordinates(1, 2);
        System.out.println("Bourne's current location - " + coordinates);
    }
}

druckt

Bourne's current location - Coordinates@addbf1 //concise, but not really useful to the reader

Überschreiben Sie nun toString () in der Coordinates-Klasse wie folgt:

@Override
public String toString() {
    return "(" + x + ", " + y + ")";
}

führt zu

Bourne's current location - (1.0, 2.0) //concise and informative

Die Nützlichkeit des Überschreibens von toString () wird noch größer, wenn die Methode für Sammlungen aufgerufen wird, die Verweise auf diese Objekte enthalten. Zum Beispiel das Folgende

public static void main(String[] args) {
    Coordinates bourneLocation = new Coordinates(90, 0);
    Coordinates bondLocation = new Coordinates(45, 90);
    Map<String, Coordinates> locations = new HashMap<String, Coordinates>();
    locations.put("Jason Bourne", bourneLocation);
    locations.put("James Bond", bondLocation);
    System.out.println(locations);
}

druckt

{James Bond=(45.0, 90.0), Jason Bourne=(90.0, 0.0)}

an Stelle von,

{James Bond=Coordinates@addbf1, Jason Bourne=Coordinates@42e816}

Nur wenige Implementierungszeiger,

  1. Sie sollten die toString () -Methode fast immer überschreiben. Einer der Fälle, in denen die Überschreibung nicht erforderlich wäre, sind Dienstprogrammklassen, die statische Dienstprogrammmethoden nach Art von java.util.Math gruppieren . Der Fall, dass keine Außerkraftsetzung erforderlich ist, ist ziemlich intuitiv. fast immer würde man es wissen.
  2. Die zurückgegebene Zeichenfolge sollte präzise und informativ sein, idealerweise selbsterklärend.
  3. Zumindest die Felder, die zum Herstellen der Äquivalenz zwischen zwei verschiedenen Objekten verwendet werden, dh die Felder, die in der Implementierung der equals () -Methode verwendet werden, sollten von der toString () -Methode ausgespuckt werden.
  4. Geben Sie Accessoren / Getter für alle Instanzfelder an, die in der zurückgegebenen Zeichenfolge enthalten sind. Zum Beispiel in der Klasse "Koordinaten"

    public double getX() {
        return x;
    }
    public double getY() {
        return y;
    }

Eine umfassende Beschreibung der toString () -Methode finden Sie in Punkt 10 des Buches Effective Java ™, Second Edition, von Josh Bloch.

sxnamit
quelle
6

Codierung:

public class Test {

    public static void main(String args[]) {

        ArrayList<Student> a = new ArrayList<Student>();
        a.add(new Student("Steve", 12, "Daniel"));
        a.add(new Student("Sachin", 10, "Tendulkar"));

        System.out.println(a);

        display(a);

    }

    static void display(ArrayList<Student> stu) {

        stu.add(new Student("Yuvi", 12, "Bhajji"));

        System.out.println(stu);

    }

}

Student.java:

public class Student {

    public String name;

    public int id;

    public String email;

    Student() {

    }

    Student(String name, int id, String email) {

        this.name = name;
        this.id = id;
        this.email = email;

    }

     public String toString(){           //using these toString to avoid the output like this [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]
          return name+" "+id+" "+email;     
         }  


    public String getName(){

        return name;
    }

    public void setName(String name){

        this.name=name;
    }

    public int getId(){

        return id;
    }

    public void setId(int id){

        this.id=id;
    }

    public String getEmail(){

        return email;

    }

    public void setEmail(String email){

        this.email=email;
    }
}

Ausgabe:

[Steve 12 Daniel, Sachin 10 Tendulkar]

[Steve 12 Daniel, Sachin 10 Tendulkar, Yuvi 12 Bhajji]

Wenn Sie toString () in der Pojo-Klasse (Student.java) nicht gewohnt sind, erhalten Sie eine Ausgabe wie [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]. Um diese Art von Problemen zu vermeiden, verwenden wir die toString () -Methode.

Steve
quelle
4

Wenn Sie in einem String-Kontext auf ein Objekt zugreifen (das kein String ist), wird toString () vom Compiler unter dem Deckmantel aufgerufen.

Deshalb

Map map = new HashMap();
System.out.println("map=" + map);

funktioniert, und indem Sie den Standard toString () von Object in Ihren eigenen Klassen überschreiben, können Sie Ihre Objekte auch in String-Kontexten nützlich machen.

(Und betrachten Sie es als Black Box! Verwenden Sie den Inhalt niemals für etwas anderes als für die Präsentation vor einem Menschen.)

Thorbjørn Ravn Andersen
quelle
3

Eine korrekt überschriebene toString-Methode kann beim Protokollieren und Debuggen von Java hilfreich sein.

USM167
quelle
2

Abgesehen davon, was Cletus in Bezug auf das Debuggen beantwortet hat, wird es immer dann verwendet, wenn Sie ein Objekt ausgeben, beispielsweise wenn Sie es verwenden

 System.out.println(myObject);

oder

System.out.println("text " + myObject);
Frank
quelle
1

Der Hauptzweck von toString besteht darin, eine String-Darstellung eines Objekts zu generieren. Dies bedeutet, dass der Rückgabewert immer ein String ist. In den meisten Fällen ist dies einfach der Klassen- und Paketname des Objekts, aber in einigen Fällen wie StringBuilder erhalten Sie tatsächlich einen String-Text.

heb
quelle
0
/**
 * This toString-Method works for every Class, where you want to display all the fields and its values
 */
public String toString() {

    StringBuffer sb = new StringBuffer();

    Field[] fields = getClass().getDeclaredFields(); //Get all fields incl. private ones

    for (Field field : fields){

        try {

            field.setAccessible(true);
            String key=field.getName();
            String value;

            try{
                value = (String) field.get(this);
            } catch (ClassCastException e){
                value="";
            }

            sb.append(key).append(": ").append(value).append("\n");

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    return sb.toString();
}
Redestructa
quelle
0

Wenn Sie zuerst Python und dann Java lernen. Ich denke, es spielt die gleiche Rolle wie die __str__()Methode in Python, es ist eine magische Methode wie __dict__()und, __init__()aber um auf eine Zeichenfolge zu verweisen, die das Objekt darstellt.

Lerner Zhang
quelle
-1

Das toString()konvertiert das angegebene Objekt in einen Zeichenfolgenwert.

Ankit
quelle