Contexte
Tous les objets Java ont une toString()
méthode, qui est invoquée lorsque vous essayez d'imprimer l'objet.
System.out.println(myObject); // invokes myObject.toString()
Cette méthode est définie dans la Object
classe (la superclasse de tous les objets Java). La Object.toString()
méthode renvoie une chaîne d'aspect assez laid, composée du nom de la classe, d'un @
symbole et du code de hachage de l'objet en hexadécimal. Le code pour cela ressemble à ceci:
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Un résultat tel que com.foo.MyType@2f92e0f4
peut donc être expliqué comme:
com.foo.MyType
- le nom de la classe, c'est-à-dire que la classe est MyType
dans le package com.foo
.
@
- joint la chaîne ensemble
2f92e0f4
le code de hachage de l'objet.
Le nom des classes de tableaux est un peu différent, ce qui est bien expliqué dans les Javadocs pour Class.getName()
. Par exemple, [Ljava.lang.String
signifie:
[
- un tableau unidimensionnel (par opposition à [[
ou [[[
etc.)
L
- le tableau contient une classe ou une interface
java.lang.String
- le type d'objets dans le tableau
Personnalisation de la sortie
Pour imprimer quelque chose de différent lorsque vous appelez System.out.println(myObject)
, vous devez remplacer la toString()
méthode dans votre propre classe. Voici un exemple simple:
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
Maintenant, si nous imprimons un Person
, nous voyons leur nom plutôt que com.foo.Person@12345678
.
Gardez à l'esprit que ce toString()
n'est qu'un moyen de convertir un objet en chaîne. Généralement, cette sortie doit décrire complètement votre objet de manière claire et concise. Un meilleur toString()
pour notre Person
classe pourrait être:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
Ce qui imprimerait, par exemple Person[name=Henry]
. C'est une donnée vraiment utile pour le débogage / test.
Si vous souhaitez vous concentrer sur un seul aspect de votre objet ou inclure beaucoup de mise en forme jazzy, il serait préférable de définir une méthode distincte à la place, par exemple String toElegantReport() {...}
.
Génération automatique de la sortie
De nombreux IDE prennent en charge la génération automatique d'une toString()
méthode, en fonction des champs de la classe. Voir les documents pour Eclipse et IntelliJ , par exemple.
Plusieurs bibliothèques Java populaires offrent également cette fonctionnalité. Quelques exemples:
Impression de groupes d'objets
Vous avez donc créé un joli toString()
pour votre classe. Que se passe-t-il si cette classe est placée dans un tableau ou une collection?
Tableaux
Si vous avez un tableau d'objets, vous pouvez appeler Arrays.toString()
pour produire une représentation simple du contenu du tableau. Par exemple, considérez ce tableau d' Person
objets:
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
Remarque: il s'agit d'un appel à une méthode statique appelée toString()
dans la classe Arrays, qui est différente de ce que nous avons discuté ci-dessus.
Si vous disposez d'un tableau multidimensionnel , vous pouvez utiliser Arrays.deepToString()
pour obtenir le même type de sortie.
Les collections
La plupart des collections produiront une jolie sortie basée sur l'appel .toString()
à chaque élément.
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
Il vous suffit donc de vous assurer que vos éléments de liste définissent une belle, toString()
comme indiqué ci-dessus.