J'ai une classe définie comme suit:
public class Person {
private String name;
// constructor and getter/setter omitted
}
J'ai essayé d'imprimer une instance de ma classe:
System.out.println(myPerson);
mais je suis la sortie suivante: com.foo.Person@2f92e0f4
.
Une chose similaire s'est produite lorsque j'ai essayé d'imprimer un tableau d' Person
objets:
Person[] people = //...
System.out.println(people);
J'ai obtenu la sortie: [Lcom.foo.Person;@28a418fc
Que signifie cette sortie? Comment modifier cette sortie pour qu'elle contienne le nom de ma personne? Et comment imprimer des collections de mes objets?
Remarque : il s'agit d'un Q&A canonique sur ce sujet.
Réponses:
Contexte
Tous les objets Java ont une
toString()
méthode, qui est invoquée lorsque vous essayez d'imprimer l'objet.Cette méthode est définie dans la
Object
classe (la superclasse de tous les objets Java). LaObject.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: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 estMyType
dans le packagecom.foo
.@
- joint la chaîne ensemble2f92e0f4
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 interfacejava.lang.String
- le type d'objets dans le tableauPersonnalisation de la sortie
Pour imprimer quelque chose de différent lorsque vous appelez
System.out.println(myObject)
, vous devez remplacer latoString()
méthode dans votre propre classe. Voici un exemple simple:Maintenant, si nous imprimons un
Person
, nous voyons leur nom plutôt quecom.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 meilleurtoString()
pour notrePerson
classe pourrait être: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:
ToStringBuilder
de Apache Commons LangMoreObjects.ToStringHelper
de Google Guava@ToString
annotation du projet LombokImpression 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: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.Il vous suffit donc de vous assurer que vos éléments de liste définissent une belle,
toString()
comme indiqué ci-dessus.la source
return String.format( getClass().getSimpleName() + "[ name=%s ]", name);
et vraiment à la placename
il devrait utiliser le gettergetName()
(mais les getters ont été omis dans la classe Person ...) mais si un getter a été utilisé ...return String.format( getClass().getSimpleName() + "[ name=%s ]", getName());
Arrays.toString()
sorte que vous pouvez également l'utiliser pour des tableaux de primitives (int[]
,double[]
).Arrays.deepToString()
Gère également très bien les tableaux multidimensionnels de primitives.Je pense qu'apache fournit une meilleure classe util qui fournit une fonction pour obtenir la chaîne
la source
Chaque classe en Java a la
toString()
méthode par défaut, qui est appelée si vous passez un objet de cette classe àSystem.out.println()
. Par défaut, cet appel renvoie le className @ hashcode de cet objet.Vous pouvez remplacer la méthode toString d'une classe pour obtenir une sortie différente. Voir cet exemple
la source
[Lcom.foo.Person;@28a418fc
en sortie: c'est aussi la sortie de latoString()
méthode, mais de celle qui est implémentée dans la classe qui est générée au moment de l'exécution pour le typePerson[]
, nonPerson
(voir stackoverflow.com/a/8546532/1542343 ).Dans Eclipse, allez dans votre classe, clic droit-> source-> Générer
toString()
;Il remplacera la
toString()
méthode et affichera l'objet de cette classe.la source
Je préfère utiliser une fonction utilitaire qui utilise GSON pour désérialiser l'objet Java en chaîne JSON.
la source
return Gson.toJson(object);
cas, sinon fonctionner parfaitement.Dans intellij, vous pouvez générer automatiquement la méthode toString en appuyant sur alt + encart puis en sélectionnant toString () voici un résultat pour une classe de test:
Comme vous pouvez le voir, il génère une chaîne en concaténant plusieurs attributs de la classe, pour les primitives, il affichera leurs valeurs et pour les types de référence, il utilisera leur type de classe (dans ce cas, pour la méthode de chaîne de Test2).
la source
Par défaut, chaque objet en Java a la
toString()
méthode qui génère l'ObjectType @ HashCode.Si vous voulez plus d'informations utiles, vous devez remplacer la
toString()
méthode dans votre classe.Désormais, lorsque vous imprimez l'objet personne à l'aide de
System.out.prtinln(personObj);
celui-ci, le nom de la personne s'affiche à la place du nom de classe et du code de hachage.Dans votre deuxième cas, lorsque vous essayez d'imprimer le tableau, il imprime
[Lcom.foo.Person;@28a418fc
le type de tableau et son code de hachage.Si vous souhaitez imprimer les noms des personnes, il existe plusieurs façons.
Vous pouvez écrire votre propre fonction qui itère chaque personne et imprime
Vous pouvez l'imprimer en utilisant Arrays.toString (). Cela me semble le plus simple.
Vous pouvez l'imprimer à la manière de Java 8 (en utilisant les flux et la référence de méthode).
Il pourrait également y avoir d'autres moyens. J'espère que cela t'aides. :)
la source
Si vous imprimez directement n'importe quel objet de la personne, cela correspondra
ClassName@HashCode
au code.dans votre cas
com.foo.Person@2f92e0f4
est en cours d'impression. OùPerson
est une classe à laquelle appartient l'objet et2f92e0f4
est hashCode de l'objet.Maintenant, si vous essayez d'utiliser l'objet de
Person
alors il affichera le nomla source
Si vous regardez la classe Object (classe parent de toutes les classes en Java), l'implémentation de la méthode toString () est
chaque fois que vous imprimez un objet en Java, toString () sera appelé. Maintenant, c'est à vous de décider si vous remplacez toString (), votre méthode appellera un autre appel de méthode de classe Object.
la source