De toString() methode is een standaardmethode van de Object klasse in Java, die een stringrepresentatie van een object oplevert. Historisch gezien is deze geïntroduceerd om te helpen met debuggen en loggen, zodat in plaats van technische informatie over het object (ClassName@hashCode) een betekenisvolle, leesbare beschrijving kan worden verkregen.
Oorspronkelijk, als je toString() niet overschrijft, retourneert de methode een string in de vorm van klasse_naam@hashcode. Dit is ongemakkelijk te begrijpen of de status van het object weer te geven. Daarom is het overschrijven van toString() een goede praktijk geworden.
Zonder expliciete implementatie van toString() wordt debuggen en loggen van objecten bemoeilijkt. Het is moeilijk te begrijpen wat er exact in het object zit, zonder de interne structuur of huidige waarden van de velden te kennen.
Correcte overschrijving van toString() maakt het mogelijk:
Voorbeeldcode:
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } }
Belangrijke kenmerken:
Is het verplicht om altijd de toString() methode in alle klassen te overschrijven?
Nee, het is niet verplicht, maar het wordt sterk aanbevolen om deze te overschrijven in klassen waarvan de objecten vaak in logs worden weergegeven of worden gebruikt voor debugging.
Kan de toString() methode uitzonderingen gooien?
Technisch gezien — ja, als er bijvoorbeeld een NullPointerException optreedt bij het toegang krijgen tot een veld zonder te controleren op null. Maar een goede praktijk is om dit te vermijden, zodat toString() altijd een correcte string retourneert.
Is het noodzakelijk om toString() expliciet aan te roepen?
Nee, de compiler roept het impliciet aan bij het samenvoegen van een object met een string of bij het afdrukken van een object via System.out.println.
Person p = new Person("Ivan", 25); System.out.println(p); // Roept automatisch p.toString() aan
Een programmeur schrijft de toString() niet over in de User klasse en logt:
log.info(user);
Voordelen:
Nadelen:
User@1a2b3c, er is geen informatie over de gebruiker.Een programmeur schrijft de toString() over:
@Override public String toString() { return "User{name='" + name + "', id=" + id + "}"; }
Voordelen:
Nadelen: