← Back to list

Comprendre et maîtriser toString() en Java

1. Introduction

Waris konate · 2026-04-23 20:21 · 0 claps · 2.9 min read
#java #javafx #oracle #java11 #software-development
Open on Medium ↗

Comprendre et maîtriser toString() en Java

1. Introduction

En Java, toutes les classes héritent (directement ou indirectement) de la classe Object. Cela signifie qu’elles possèdent toutes une méthode toString(). Cette méthode permet d’obtenir une représentation textuelle d’un objet. Elle est très utilisée, souvent sans même qu’on s’en rende compte, par exemple lorsqu’on fait un System.out.println(nom_de_l’objet).

Dans cet article, on va :

  • Comprendre le comportement par défaut de toString().
  • Voir pourquoi il est rarement suffisant.
  • Apprendre à le surcharger proprement selon différents cas.

2. Comportement par défaut

Quand on affiche un objet, Java appelle automatiquement toString().Si vous ne redéfinissez pas cette méthode, c’est celle de Object qui est utilisée :

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

(je suis sûr que tu as déjà croisé ça quand tu essayait de debugger ton code :). Supposons la classe Customers avec:

public class Customer {
    private String firstName;
    private String lastName;
    // getters et setters
}

si on affiche l’objet:

Customer customer = new Customer();
System.out.println(customer);

on obtient en sortie un truc comme : com.medium.Customer@6d06d69c

3. Pourquoi surcharger toString() ?

Dans la plupart des cas, ce qu’on veut afficher, ce sont les données métier de l’objet, pas son hashcode, surcharger toString() permet :

  • De faciliter le debugging,
  • De produire des logs lisibles,
  • D’améliorer la compréhension du code.

4. Cas simple : types primitifs et String

Penons notre classe costumer d’avant et ajoutons y un champ balance:

public class CustomerPrimitiveToString extends Customer {
    private long balance;

    @Override
    public String toString() {
        return "Customer [balance=" + balance +
               ", firstName=" + getFirstName() +
               ", lastName=" + getLastName() + "]";
    }
}
// le @Override permet d'indiquer à java qu'on sait que la méthode est heritée
// mais on veut la redefinir pour notre metier 

un system.out.println, donnera : Customer [balance=110, firstName=Rajesh, lastName=Bhojwani].

5. Cas des objets complexes

Supposons maintenant qu’un client possède une commande (Order) :

public class CustomerComplexObjectToString extends Customer {
    private Order order;

    @Override
    public String toString() {
        return "Customer [order=" + order +
               ", firstName=" + getFirstName() +
               ", lastName=" + getLastName() + "]";
    }
}

le soucis ici c’est que si Order, ne definit pas explicitementson toString on retombe sur la sortie du haut, à savoir Order@1a2b3c. La logique voudrait que chaque objet ait son toString bien defini.

6. Gestion des tableaux

Avec un tableau, par exemple order on aura:

private Order[] orders;
// Si on fait un println on aura 
[Order;@4e25154f

Afin de palier à ça, on a Arrays.toString():

@Override
public String toString() {
    return "Customer [orders=" + Arrays.toString(orders) +
           ", firstName=" + getFirstName() +
           ", lastName=" + getLastName() + "]";
}

// un println
orders=[Order [orderId=A1111, desc=Game, value=0]]....

NB: Arrays.toString() ne fait pas de magie, son but est gerer le toString() quand il s’agit d’un tableau du model. Si vous ne definissez pas le toString, vous aurez toujours Order;@4e25154f

7. Wrappers, collections et StringBuffer

J’ai une bonne nouvelle pour vous, certains types Java redéfinissent déjà toString() correctement :

  • Wrappers (Integer, Long, etc.)
  • Collections (List, Set, etc.)
  • StringBuffer / StringBuilder

Je ne t’apprends rien ce sont des objets java, int#Integer. Un exemple pour eclaircir les notions:

public class CustomerWrapperCollectionToString extends Customer {
    private Integer score;
    private List<String> orders;
    private StringBuffer fullname;

    @Override
    public String toString() {
        return "Customer [score=" + score +
               ", orders=" + orders +
               ", fullname=" + fullname +
               ", firstName=" + getFirstName() +
               ", lastName=" + getLastName() + "]";
    }
}
system.out.println(CustomerWrapperCollectionToString)
//Ici, aucun effort supplémentaire n’est nécessaire : tout est déjà lisible.
  1. Bonnes pratiques

Quelques conseils pour un bon toString() :

  • Inclure les champs importants uniquement
  • Garder un format clair et cohérent
  • Éviter les données sensibles (mot de passe, token…)
  • Ne pas faire de logique complexe
  • Penser à la lisibilité avant tout

9. Conclusion

toString() est une méthode simple… mais essentielle. Bien utilisée, elle :

  • Améliore considérablement le debugging
  • Rend les logs réellement exploitables
  • Facilite la maintenance du code

En résumé : ne laissez pas le toString() par défaut sur vos objets métier. Cépendant, il faut faire attention car une mauvaise utilisation peut avoir des effets inattendus, voire critiques. Un toString() mal conçu (trop coûteux, récursif, ou exposant trop de données) peut, dans certains cas, impacter sérieusement les performances d’une application web. Je vous en parle dans mon prochain article.


메타데이터
post_id
5bd4b674473d
slug
comprendre-et-maîtriser-tostring-en-java-5bd4b674473d
url
https://medium.com/@wariskonate63/comprendre-et-ma%C3%AEtriser-tostring-en-java-5bd4b674473d
canonical_url
https://medium.com/@wariskonate63/comprendre-et-ma%C3%AEtriser-tostring-en-java-5bd4b674473d
author_url
https://medium.com/@wariskonate63
status
ok
fetched_at
2026-06-26 03:39:16