Método Java toString ()

1. Información general

Cada clase en Java es un hijo de la clase Object , ya sea directa o indirectamente. Y dado que la clase Object contiene un método toString () , podemos llamar a toString () en cualquier instancia y obtener su representación de cadena.

En este tutorial, veremos el comportamiento predeterminado de toString () y aprenderemos cómo cambiar su comportamiento.

2. Comportamiento predeterminado

Siempre que imprimimos una referencia de objeto, invoca el método toString () internamente. Entonces, si no definimos un método toString () en nuestra clase, entonces se invoca Object # toString () .

El método toString () del objeto es bastante genérico:

public String toString() { return getClass().getName()+"@"+Integer.toHexString(hashCode()); }

Para ver cómo funciona esto, creemos un objeto Cliente que usaremos a lo largo de nuestro tutorial:

public class Customer { private String firstName; private String lastName; // standard getters and setters. No toString() implementation }

Ahora, si intentamos imprimir nuestro objeto C ustomer , se llamará Object # toString () , y la salida será similar a:

[email protected]

3. Anulación del comportamiento predeterminado

Al observar el resultado anterior, podemos ver que no nos brinda mucha información sobre el contenido de nuestro objeto Cliente . Generalmente, no estamos interesados ​​en conocer el código hash de un objeto, sino más bien el contenido de los atributos de nuestro objeto.

Al anular el comportamiento predeterminado del método toString () , podemos hacer que la salida de la llamada al método sea más significativa.

Ahora, veamos algunos escenarios diferentes usando objetos para ver cómo podemos anular este comportamiento predeterminado.

4. Tipos primitivos y cadenas

Nuestro objeto Cliente tiene atributos tanto String como primitivos. Necesitamos anular el método toString () para lograr una salida más significativa:

public class CustomerPrimitiveToString extends Customer { private long balance; @Override public String toString() { return "Customer [balance=" + balance + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]"; } } 

Veamos qué obtenemos cuando llamamos a toString () ahora:

@Test public void givenPrimitive_whenToString_thenCustomerDetails() { CustomerPrimitiveToString customer = new CustomerPrimitiveToString(); customer.setFirstName("Rajesh"); customer.setLastName("Bhojwani"); customer.setBalance(110); assertEquals("Customer [balance=110, getFirstName()=Rajesh, getLastName()=Bhojwani]", customer.toString()); }

5. Objetos Java complejos

Consideremos ahora un escenario en el que nuestro objeto Cliente también contiene un atributo de orden que es de tipo Orden. Nuestra clase Order tiene campos de tipo de datos tanto String como primitivos.

Entonces, anulemos toString () nuevamente:

public class CustomerComplexObjectToString extends Customer { private Order order; //standard setters and getters @Override public String toString() { return "Customer [order=" + order + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]"; } }

Dado que el pedido es un objeto complejo , si solo imprimimos nuestro objeto Cliente , sin anular el método toString () en nuestra clase Pedido , imprimirá los pedidos como [correo electrónico protegido].

Para solucionarlo, también anulemos toString () en Order :

public class Order { private String orderId; private String desc; private long value; private String status; @Override public String toString() { return "Order [orderId=" + orderId + ", desc=" + desc + ", value=" + value + "]"; } } 

Ahora, veamos qué sucede cuando llamamos al método toString () en nuestro objeto Cliente que contiene un atributo de orden :

@Test public void givenComplex_whenToString_thenCustomerDetails() { CustomerComplexObjectToString customer = new CustomerComplexObjectToString(); // .. set up customer as before Order order = new Order(); order.setOrderId("A1111"); order.setDesc("Game"); order.setStatus("In-Shiping"); customer.setOrders(order); assertEquals("Customer [order=Order [orderId=A1111, desc=Game, value=0], " + "getFirstName()=Rajesh, getLastName()=Bhojwani]", customer.toString()); }

6. Matriz de objetos

A continuación, vamos a cambiar nuestro cliente tener una matriz de orden s . Si solo imprimimos nuestro objeto Cliente , sin un manejo especial para nuestro objeto de pedidos , imprimirá los pedidos como Pedido; @ .

Para solucionarlo, usemos Arrays.toString () para el campo de pedidos :

public class CustomerArrayToString extends Customer { private Order[] orders; @Override public String toString() { return "Customer [orders=" + Arrays.toString(orders) + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]"; } } 

Veamos los resultados de llamar al método toString () anterior :

@Test public void givenArray_whenToString_thenCustomerDetails() { CustomerArrayToString customer = new CustomerArrayToString(); // .. set up customer as before // .. set up order as before customer.setOrders(new Order[] { order }); assertEquals("Customer [orders=[Order [orderId=A1111, desc=Game, value=0]], " + "getFirstName()=Rajesh, getLastName()=Bhojwani]", customer.toString()); }

7. Envoltorios, colecciones y StringBuffers

Cuando un objeto se compone completamente de contenedores, colecciones o StringBuffer s, no se requiere una implementación personalizada de toString () porque estos objetos ya han anulado el método toString () con representaciones significativas:

public class CustomerWrapperCollectionToString extends Customer { private Integer score; // Wrapper class object private List orders; // Collection object private StringBuffer fullname; // StringBuffer object @Override public String toString() { return "Customer [score=" + score + ", orders=" + orders + ", fullname=" + fullname + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]"; } } 

Veamos nuevamente los resultados de llamar a toString () :

@Test public void givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails() { CustomerWrapperCollectionToString customer = new CustomerWrapperCollectionToString(); // .. set up customer as before // .. set up orders as before customer.setOrders(new Order[] { order }); StringBuffer fullname = new StringBuffer(); fullname.append(customer.getLastName()+ ", " + customer.getFirstName()); assertEquals("Customer [score=8, orders=[Book, Pen], fullname=Bhojwani, Rajesh, getFirstName()=Rajesh, " + "getLastName()=Bhojwani]", customer.toString()); }

8. Conclusión

En este artículo, analizamos la creación de nuestras propias implementaciones del método toString () .

Todo el código fuente de este artículo está disponible en GitHub.