Méthode Java toString ()

1. Vue d'ensemble

Chaque classe en Java est un enfant de la classe Object directement ou indirectement. Et comme la classe Object contient une méthode toString () , nous pouvons appeler toString () sur n'importe quelle instance et obtenir sa représentation sous forme de chaîne.

Dans ce didacticiel, nous allons examiner le comportement par défaut de toString () et apprendre à modifier son comportement.

2. Comportement par défaut

Chaque fois que nous imprimons une référence d'objet, elle invoque la méthode toString () en interne. Donc, si nous ne définissons pas de méthode toString () dans notre classe, alors Object # toString () est appelé.

La méthode toString () de l'objet est assez générique:

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

Pour voir comment cela fonctionne, créons un objet Customer que nous utiliserons tout au long de notre tutoriel:

public class Customer { private String firstName; private String lastName; // standard getters and setters. No toString() implementation }

Maintenant, si nous essayons d'imprimer notre objet C ustomer , Object # toString () sera appelé, et la sortie sera similaire à:

[email protected]

3. Remplacer le comportement par défaut

En regardant la sortie ci-dessus, nous pouvons voir qu'elle ne nous donne pas beaucoup d'informations sur le contenu de notre objet Client . En général, nous ne sommes pas intéressés à connaître le hashcode d'un objet, mais plutôt le contenu des attributs de notre objet.

En remplaçant le comportement par défaut de la méthode toString () , nous pouvons rendre la sortie de l'appel de méthode plus significative.

Examinons maintenant quelques scénarios différents utilisant des objets pour voir comment nous pouvons remplacer ce comportement par défaut.

4. Types primitifs et chaînes

Notre objet Client a à la fois des attributs String et primitifs. Nous devons remplacer la méthode toString () pour obtenir une sortie plus significative:

public class CustomerPrimitiveToString extends Customer { private long balance; @Override public String toString() { return "Customer [balance=" + balance + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]"; } } 

Voyons ce que nous obtenons lorsque nous appelons toString () maintenant:

@Test public void givenPrimitive_whenToString_thenCustomerDetails() { CustomerPrimitiveToString customer = new CustomerPrimitiveToString(); customer.setFirstName("Rajesh"); customer.setLastName("Bhojwani"); customer.setBalance(110); assertEquals("Customer [balance=110, getFirstName()=Rajesh, getLastName()=Bhojwani]", customer.toString()); }

5. Objets Java complexes

Considérons maintenant un scénario dans lequel notre objet Client contient également un attribut de commande de type Commande. Notre classe Order contient à la fois des champs de type de données String et primitif.

Alors, remplaçons à nouveau toString () :

public class CustomerComplexObjectToString extends Customer { private Order order; //standard setters and getters @Override public String toString() { return "Customer [order=" + order + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]"; } }

Puisque la commande est un objet complexe , si nous imprimons simplement notre objet Client , sans remplacer la méthode toString () dans notre classe Order , elle imprimera les commandes sous la forme [email protected].

Pour résoudre ce problème, remplaçons également toString () dans Order :

public class Order { private String orderId; private String desc; private long value; private String status; @Override public String toString() { return "Order [orderId=" + orderId + ", desc=" + desc + ", value=" + value + "]"; } } 

Voyons maintenant ce qui se passe lorsque nous appelons la méthode toString () sur notre objet Customer qui contient un attribut de commande :

@Test public void givenComplex_whenToString_thenCustomerDetails() { CustomerComplexObjectToString customer = new CustomerComplexObjectToString(); // .. set up customer as before Order order = new Order(); order.setOrderId("A1111"); order.setDesc("Game"); order.setStatus("In-Shiping"); customer.setOrders(order); assertEquals("Customer [order=Order [orderId=A1111, desc=Game, value=0], " + "getFirstName()=Rajesh, getLastName()=Bhojwani]", customer.toString()); }

6. Tableau d'objets

Ensuite, nous allons changer notre client d'avoir un tableau de commande s . Si nous venons imprimer notre client objet, sans traitement spécial pour nos commandes objet, il imprimera les commandes en ordre; @ .

Pour résoudre ce problème, utilisons Arrays.toString () pour le champ orders :

public class CustomerArrayToString extends Customer { private Order[] orders; @Override public String toString() { return "Customer [orders=" + Arrays.toString(orders) + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]"; } } 

Voyons les résultats de l'appel de la méthode toString () ci-dessus :

@Test public void givenArray_whenToString_thenCustomerDetails() { CustomerArrayToString customer = new CustomerArrayToString(); // .. set up customer as before // .. set up order as before customer.setOrders(new Order[] { order }); assertEquals("Customer [orders=[Order [orderId=A1111, desc=Game, value=0]], " + "getFirstName()=Rajesh, getLastName()=Bhojwani]", customer.toString()); }

7. Wrappers, collections et StringBuffers

Lorsqu'un objet est entièrement composé de wrappers, de collections ou de StringBuffer , aucune implémentation personnalisée de toString () n'est requise car ces objets ont déjà remplacé la méthode toString () par des représentations significatives:

public class CustomerWrapperCollectionToString extends Customer { private Integer score; // Wrapper class object private List orders; // Collection object private StringBuffer fullname; // StringBuffer object @Override public String toString() { return "Customer [score=" + score + ", orders=" + orders + ", fullname=" + fullname + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]"; } } 

Voyons à nouveau les résultats de l'appel à toString () :

@Test public void givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails() { CustomerWrapperCollectionToString customer = new CustomerWrapperCollectionToString(); // .. set up customer as before // .. set up orders as before customer.setOrders(new Order[] { order }); StringBuffer fullname = new StringBuffer(); fullname.append(customer.getLastName()+ ", " + customer.getFirstName()); assertEquals("Customer [score=8, orders=[Book, Pen], fullname=Bhojwani, Rajesh, getFirstName()=Rajesh, " + "getLastName()=Bhojwani]", customer.toString()); }

8. Conclusion

Dans cet article, nous avons examiné la création de nos propres implémentations de la méthode toString () .

Tout le code source de cet article est disponible à l'adresse over sur GitHub.