Tengo una clase definida de la siguiente manera:
public class Person {
private String name;
// constructor and getter/setter omitted
}
Traté de imprimir una instancia de mi clase:
System.out.println(myPerson);
pero me dio el siguiente resultado: com.foo.Person@2f92e0f4
.
Algo similar sucedió cuando intenté imprimir una matriz de Person
objetos:
Person[] people = //...
System.out.println(people);
Tengo la salida: [Lcom.foo.Person;@28a418fc
¿Qué significa esta salida? ¿Cómo cambio esta salida para que contenga el nombre de mi persona? ¿Y cómo imprimo colecciones de mis objetos?
Nota : esto pretende ser un Q&A canónico sobre este tema.
Respuestas:
Antecedentes
Todos los objetos Java tienen un
toString()
método, que se invoca cuando intenta imprimir el objeto.Este método se define en la
Object
clase (la superclase de todos los objetos Java). ElObject.toString()
método devuelve una cadena de aspecto bastante feo, compuesta por el nombre de la clase, un@
símbolo y el código hash del objeto en hexadecimal. El código para esto se ve así:Un resultado como el que
com.foo.MyType@2f92e0f4
se puede explicar como:com.foo.MyType
- el nombre de la clase, es decir, la clase estáMyType
en el paquetecom.foo
.@
- une la cuerda2f92e0f4
El código hash del objeto.El nombre de las clases de matriz se ve un poco diferente, lo cual se explica bien en los Javadocs para
Class.getName()
. Por ejemplo,[Ljava.lang.String
significa:[
- una matriz unidimensional (a diferencia de[[
o[[[
etc.)L
- la matriz contiene una clase o interfazjava.lang.String
- el tipo de objetos en la matrizPersonalizar la salida
Para imprimir algo diferente cuando llama
System.out.println(myObject)
, debe anular eltoString()
método en su propia clase. Aquí hay un ejemplo simple:Ahora, si imprimimos un
Person
, vemos su nombre en lugar decom.foo.Person@12345678
.Tenga en cuenta que esta
toString()
es solo una forma de convertir un objeto en una cadena. Por lo general, esta salida debe describir completamente su objeto de manera clara y concisa. Un mejortoString()
para nuestraPerson
clase podría ser:Lo que imprimiría, por ejemplo,
Person[name=Henry]
. Esa es una pieza de datos realmente útil para la depuración / prueba.Si desea enfocarse en un solo aspecto de su objeto o incluir un gran formato de jazz, puede ser mejor definir un método separado, por ejemplo
String toElegantReport() {...}
.Generando automáticamente la salida
Muchos IDE ofrecen soporte para autogenerar un
toString()
método, basado en los campos de la clase. Ver documentos para Eclipse e IntelliJ , por ejemplo.Varias bibliotecas populares de Java también ofrecen esta característica. Algunos ejemplos incluyen:
ToStringBuilder
de Apache Commons LangMoreObjects.ToStringHelper
de Google Guava@ToString
Anotación del Proyecto LombokImprimir grupos de objetos
Así que has creado un bonito
toString()
para tu clase. ¿Qué sucede si esa clase se coloca en una matriz o una colección?Matrices
Si tiene una matriz de objetos, puede llamar
Arrays.toString()
para producir una representación simple de los contenidos de la matriz. Por ejemplo, considere esta matriz dePerson
objetos:Nota: esta es una llamada a un método estático llamado
toString()
en la clase Arrays, que es diferente a lo que hemos estado discutiendo anteriormente.Si tiene una matriz multidimensional , puede usarla
Arrays.deepToString()
para lograr el mismo tipo de salida.Colecciones
La mayoría de las colecciones producirán una salida bonita basada en la invocación
.toString()
de cada elemento.Por lo tanto, solo debe asegurarse de que los elementos de su lista definan un elemento agradable
toString()
como se discutió anteriormente.fuente
return String.format( getClass().getSimpleName() + "[ name=%s ]", name);
y realmente en lugar dename
usar el captadorgetName()
(pero los captadores se omitieron en la clase Persona ...) pero si se utilizó un captador ...return String.format( getClass().getSimpleName() + "[ name=%s ]", getName());
Arrays.toString()
modo que también puede usarlo para matrices de primitivas (int[]
,double[]
). TambiénArrays.deepToString()
maneja arreglos multidimensionales de primitivas muy bien.Creo que apache proporciona una mejor clase de utilidad que proporciona una función para obtener la cadena
fuente
Cada clase en Java tiene el
toString()
método por defecto, que se llama si le pasa algún objeto de esa claseSystem.out.println()
. Por defecto, esta llamada devuelve el className @ hashcode de ese objeto.Puede anular el método toString de una clase para obtener una salida diferente. Mira este ejemplo
fuente
[Lcom.foo.Person;@28a418fc
como salida: esa también es la salida deltoString()
método, pero del que se implementa en la clase que se genera en tiempo de ejecución para el tipoPerson[]
, noPerson
(ver stackoverflow.com/a/8546532/1542343 ).En Eclipse, vaya a su clase, haga clic derecho-> fuente-> Generar
toString()
;Anulará el
toString()
método e imprimirá el objeto de esa clase.fuente
Prefiero usar una función de utilidad que usa GSON para deserializar el objeto Java en una cadena JSON.
fuente
return Gson.toJson(object);
, de lo contrario funcionará perfectamente.En intellij puede generar automáticamente el método toString presionando alt + recuadro y luego seleccionando toString () aquí hay una salida para una clase de prueba:
Como puede ver, genera una Cadena concatenando varios atributos de la clase, para las primitivas imprimirá sus valores y para los tipos de referencia usará su tipo de clase (en este caso, el método de cadena de Test2).
fuente
Por defecto, cada objeto en Java tiene el
toString()
método que genera el ObjectType @ HashCode.Si desea información más significativa, debe anular el
toString()
método en su clase.Ahora cuando imprime el objeto persona usando
System.out.prtinln(personObj);
, imprimirá el nombre de la persona en lugar del nombre de clase y el código hash.En su segundo caso, cuando intenta imprimir la matriz, imprime
[Lcom.foo.Person;@28a418fc
el tipo de matriz y su código hash.Si desea imprimir los nombres de las personas, hay muchas formas.
Podrías escribir tu propia función que itera cada persona e imprime
Puede imprimirlo usando Arrays.toString (). Esto me parece lo más simple.
Puede imprimirlo de la manera Java 8 (usando secuencias y referencia de método).
Puede haber otras formas también. Espero que esto ayude. :)
fuente
Si imprime directamente cualquier objeto de persona, se
ClassName@HashCode
en el Código.en su caso se
com.foo.Person@2f92e0f4
esta imprimiendo. WherePerson
es una clase a la que pertenece el objeto y2f92e0f4
es hashCode del objeto.Ahora, si intenta usar el objeto de
Person
, imprimirá el nombrefuente
Si observa la clase Object (clase padre de todas las clases en Java), la implementación del método toString () es
cada vez que imprima cualquier objeto en Java, se llamará a toString (). Ahora depende de usted si anula toString (), entonces su método llamará a otra llamada al método de la clase Object.
fuente