HOWTO · Java
Anular el método toString en Java
Este artículo explica cómo anular el método toString() en Java
En esta página
Cuando Java imprime un objeto, llama al método toString() de ese objeto para obtener texto. La implementación predeterminada heredada suele identificar la clase del objeto y mostrar un valor basado en un hash, lo que puede ayudar a distinguir instancias, pero rara vez explica su contenido. Anule toString() para ofrecer una representación concisa que resulte útil en los registros, la depuración y la salida habitual.
Qué significa la salida predeterminada de toString()
Todas las clases de Java heredan toString() de Object, a menos que una superclase o la propia clase lo anule. Las llamadas como System.out.println(book) usan la representación en texto del objeto; la llamada es implícita, así que no hace falta escribir book.toString().
La representación predeterminada no es un identificador estable ni garantiza que muestre los campos del objeto. La parte basada en un hash puede variar entre ejecuciones y no permite leer el estado del objeto. Evite copiar un valor predeterminado de ejemplo en la lógica de la aplicación o en las pruebas. Conviene crear una implementación personalizada cuando una clase necesita una representación textual más informativa.
Anular toString() con @Override
Declare un método público con la firma exacta public String toString() y devuelva un String. La anotación @Override indica al compilador que este método debe sustituir a uno heredado; también ayuda a detectar nombres mal escritos o listas de parámetros incorrectas. Este ejemplo completo guarda el título y el autor de un libro y construye su representación a partir de esos campos:
Ejecute este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
public class BookExample {
public static void main(String[] args) {
Book book = new Book("Dune", "Frank Herbert");
System.out.println(book);
}
}
class Book {
private final String title;
private final String author;
Book(String title, String author) {
this.title = title;
this.author = author;
}
@Override
public String toString() {
return "Book{title='" + title + "', author='" + author + "'}";
}
}
Compilar y ejecutar el ejemplo
Guarde el código fuente en un archivo llamado BookExample.java, ya que la clase pública se llama BookExample. Desde ese directorio, compílelo con javac BookExample.java y luego ejecútelo con java BookExample. La ejecución correcta imprime Book{title='Dune', author='Frank Herbert'}, la representación que devuelve Book.toString().
La distinción clave es que toString() devuelve una cadena; por sí solo no imprime nada. System.out.println(book) solicita la representación y la escribe en la consola. También puede usar la cadena devuelta en un registro o en otro mensaje, dejando las decisiones sobre mostrarla o registrarla fuera del método.
Elegir una salida útil para toString()
Incluya los campos que ayuden a identificar el objeto y comprender su estado actual. Mantenga un formato conciso, etiquete los valores cuando eso aporte claridad y omita los secretos, como contraseñas o tokens de acceso. La representación está destinada a las personas, así que elija valores estables y comprensibles en lugar de depender del texto basado en el hash heredado.
El método debe describir el estado, no realizar tareas ajenas a ese propósito: evite modificar campos, imprimir mensajes o hacer operaciones costosas mientras construye la cadena. Si una clase tiene muchos campos, incluya los más útiles para el diagnóstico en vez de devolver un volcado difícil de manejar. Si un formato exacto forma parte de un archivo público o de un protocolo de red, defínalo y pruébelo por separado; quienes llamen al método no deberían tener que analizar una representación de depuración como si fuera un contrato de datos.