Antecedentes
Todos los objetos Java tienen un toString()
método, que se invoca cuando intenta imprimir el objeto.
System.out.println(myObject); // invokes myObject.toString()
Este método se define en la Object
clase (la superclase de todos los objetos Java). El Object.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í:
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
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 paquete com.foo
.
@
- une la cuerda
2f92e0f4
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 interfaz
java.lang.String
- el tipo de objetos en la matriz
Personalizar la salida
Para imprimir algo diferente cuando llama System.out.println(myObject)
, debe anular el toString()
método en su propia clase. Aquí hay un ejemplo simple:
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
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 mejor toString()
para nuestra Person
clase podría ser:
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
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:
Imprimir 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 de Person
objetos:
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
Nota: esta es una llamada a un método estático llamadotoString()
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.
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
Por lo tanto, solo debe asegurarse de que los elementos de su lista definan un elemento agradable toString()
como se discutió anteriormente.