web-dev-qa-db-fra.com

Comment utiliser la méthode toString en Java?

Quelqu'un peut-il m'expliquer le concept de la méthode toString(), définie dans la classe Object? Comment est-il utilisé et quel est son but?

106
David Brown

Depuis le Object.toString () docs:

Retourne une représentation sous forme de chaîne du objet. En général, le toString La méthode retourne une chaîne que "représente textuellement" cet objet . Le résultat devrait être concis mais représentation informative qui est facile pour une personne à lire. Il est recommandé que toutes les sous-classes remplacer cette méthode. 

La méthode toString pour la classe Object retourne une chaîne composée du nom de la classe dont l'objet est une instance, le caractère at-sign «@» et l'hexadécimal non signé représentation du code de hachage du objet. En d'autres termes, cette méthode renvoie une chaîne égale à la valeur de:

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

Exemple:

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

output:- mystr.toString: [Ljava.lang.String;@13aaa14a
81
Sean Patrick Floyd

Utilisation de String toString: Chaque fois que vous souhaitez explorer le constructeur appelé valeur sous la forme String, vous pouvez simplement utiliser String toString ... Pour un exemple ...

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());
        }
    }

}

... copiez ce programme dans votre Eclipse et exécutez-le ... vous obtiendrez des idées sur String toString ...

38
Naseem Afzal

La méthode toString() renvoie une représentation textual d'un objet. Une implémentation de base est déjà incluse dans Java.lang.Object et, comme tous les objets héritent de Java.lang.Object, il est garanti que tous les objets en Java ont cette méthode.

Redéfinir la méthode est toujours une bonne idée, en particulier pour le débogage, car les débogueurs affichent souvent des objets en fonction du résultat de la méthode toString(). Utilisez donc une implémentation significative, mais utilisez-la à des fins technique. La logique d'application doit utiliser des accesseurs:

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()+"]";
  }
}
32
Andreas_D

Il peut éventuellement avoir des utilisations dans le contexte d'une application, mais le plus souvent, il est utilisé à des fins de débogage. Par exemple, lorsque vous atteignez un point d'arrêt dans un IDE, il est beaucoup plus facile de lire un nom toString() significatif qui soit, plutôt que d'inspecter leurs membres.

Aucune exigence n'est définie pour ce qu'une méthode toString() doit faire. Par convention, le plus souvent, il vous indiquera le nom de la classe et la valeur des membres de données pertinents. Le plus souvent, les méthodes toString() sont générées automatiquement dans les IDE.

Se fier à une sortie particulière d’une méthode toString() ou l’analyser dans un programme est une mauvaise idée. Quoi que vous fassiez, ne vous engagez pas dans cette voie.

14
cletus

toString () retourne une représentation textuelle/textuelle de l'objet . Communément utilisée à des fins de diagnostic, comme le débogage, la journalisation, etc., la méthode toString () est utilisée pour lire des détails significatifs sur l'objet.

Il est automatiquement appelé lorsque l'objet est passé à println, print, printf, String.format (), assert ou à l'opérateur de concaténation de chaînes.

L'implémentation par défaut de toString () dans la classe Object renvoie une chaîne composée du nom de la classe de cet objet suivi du signe @ et de la représentation hexadécimale non signée du code de hachage de cet objet, à l'aide de la logique suivante.

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

Par exemple, le suivant

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);
    }
}

empreintes

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

Maintenant, en remplaçant toString () dans la classe Coordinates comme ci-dessous,

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

résulte en

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

L'utilité de remplacer toString () devient encore plus importante lorsque la méthode est appelée sur des collections contenant des références à ces objets. Par exemple, le suivant

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);
}

empreintes

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

au lieu de cela,

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

Peu d'indicateurs de mise en œuvre,

  1. Vous devriez presque toujours remplacer la méthode toString (). L'un des cas où le remplacement n'est pas obligatoire concerne les classes d'utilitaires qui regroupent des méthodes d'utilitaires statiques, à la manière de Java.util.Math . Le cas où la dérogation n'est pas requise est assez intuitif; presque toujours tu le saurais.
  2. La chaîne renvoyée doit être concise et informative, idéalement explicite.
  3. Au moins, les champs utilisés pour établir l’équivalence entre deux objets différents, c’est-à-dire les champs utilisés dans l’implémentation de la méthode equals () , doivent être extraits par la méthode toString ().
  4. Fournissez des accesseurs/getters pour tous les champs d'instance contenus dans la chaîne renvoyée. Par exemple, dans la classe Coordinates,

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

La rubrique 10 du livre Effective Java ™, Deuxième édition, de Josh Bloch, décrit de manière exhaustive la méthode toString ().

12
sxnamit

Chaque fois que vous accédez à un objet (qui n'est pas une chaîne) dans un contexte de chaîne, le compilateur toString () est appelé sous la couverture.

C'est pourquoi

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

fonctionne, et en remplaçant le standard toString () à partir de Object dans vos propres classes, vous pouvez également rendre vos objets utiles dans les contextes String.

(et considérez cela comme une boîte noire! N'utilisez jamais le contenu pour autre chose que de le présenter à un humain)

Codage:  

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;
    }
}

Sortie:

[Steve 12 Daniel, Sachin 10 Tendulkar]

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

Si vous n'êtes pas utilisé toString () dans la classe Pojo (Student.Java), vous obtiendrez une sortie telle que [com.steve.test.Student@6e1408, com.steve.test.Student@e53108].Pour éviter ce genre de problème, nous utilisons la méthode toString ().

5
Stephen

La méthode toString correctement remplacée peut aider à la journalisation et au débogage de Java.

4
USM167

Outre ce que Cletus a répondu en ce qui concerne le débogage, il est utilisé chaque fois que vous sortez un objet, comme lorsque vous utilisez

 System.out.println(myObject);

ou

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

ToString a pour objectif principal de générer une représentation sous forme de chaîne d'un objet, ce qui signifie que la valeur de retour est toujours une chaîne. Dans la plupart des cas, il s'agit simplement du nom de la classe et du package de l'objet, mais dans certains cas, comme StringBuilder, vous obtenez en fait un texte en chaîne.

2
heb

Si vous apprenez d'abord Python, puis Java. Je pense que cela joue le même rôle que __str__() méthode en Python, il s’agit d’une méthode magique comme __dict__() et __init__() mais se référant à une chaîne représentant l’objet. 

1
lerner

toString() convertit l'objet spécifié en une valeur de chaîne.

0
ankit
/**
 * 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();
}
0
redestructa