Metodo Java toString ()

1. Panoramica

Ogni classe in Java è figlia della classe Object , direttamente o indirettamente. E poiché la classe Object contiene un metodo toString () , possiamo chiamare toString () su qualsiasi istanza e ottenere la sua rappresentazione di stringa.

In questo tutorial, esamineremo il comportamento predefinito di toString () e impareremo come modificarne il comportamento.

2. Comportamento predefinito

Ogni volta che stampiamo un riferimento a un oggetto, richiama internamente il metodo toString () . Quindi, se non definiamo un metodo toString () nella nostra classe, viene richiamato Object # toString () .

Il metodo toString () di Object è piuttosto generico:

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

Per vedere come funziona, creiamo un oggetto Customer che useremo durante il nostro tutorial:

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

Ora, se proviamo a stampare il nostro oggetto C ustomer , verrà chiamato Object # toString () e l'output sarà simile a:

[email protected]

3. Ignorare il comportamento predefinito

Guardando l'output di cui sopra, possiamo vedere che non ci fornisce molte informazioni sui contenuti del nostro oggetto Customer . In generale, non ci interessa conoscere il codice hash di un oggetto, ma piuttosto il contenuto degli attributi del nostro oggetto.

Sovrascrivendo il comportamento predefinito del metodo toString () , possiamo rendere più significativo l'output della chiamata al metodo.

Ora, diamo un'occhiata ad alcuni scenari diversi che utilizzano oggetti per vedere come possiamo ignorare questo comportamento predefinito.

4. Tipi e stringhe primitive

Il nostro oggetto Customer ha attributi sia String che primitivi. Abbiamo bisogno di sovrascrivere il metodo toString () per ottenere un output più significativo:

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

Vediamo cosa otteniamo quando chiamiamo toString () ora:

@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. Oggetti Java complessi

Consideriamo ora uno scenario in cui il nostro oggetto Customer contiene anche un attributo di ordine di tipo Order. La nostra classe Order ha campi di tipo di dati sia String che primitivi.

Quindi, sovrascriviamo di nuovo toString () :

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

Poiché order è un oggetto complesso , se stampiamo semplicemente il nostro oggetto Customer , senza sovrascrivere il metodo toString () nella nostra classe Order , stamperà gli ordini come [email protected].

Per risolvere il problema, sovrascriviamo anche toString () in ordine :

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 + "]"; } } 

Ora, vediamo cosa succede quando chiamiamo il metodo toString () sul nostro oggetto Customer che contiene un attributo di ordine :

@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. Matrice di oggetti

Quindi, cerchiamo di cambiare il nostro cliente di avere una serie di Order s . Se stampiamo solo il nostro oggetto Cliente , senza una gestione speciale per l' oggetto degli ordini , stamperà gli ordini come Ordine; @ .

Per risolvere il problema, usiamo Arrays.toString () per il campo degli ordini :

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

Vediamo i risultati della chiamata al metodo toString () sopra :

@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. Wrapper, collezioni e StringBuffer

Quando un oggetto è costituito interamente da wrapper, raccolte o StringBuffer , non è richiesta alcuna implementazione toString () personalizzata perché questi oggetti hanno già sovrascritto il metodo toString () con rappresentazioni significative:

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() + "]"; } } 

Vediamo di nuovo i risultati della chiamata 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. Conclusione

In questo articolo, abbiamo esaminato la creazione delle nostre implementazioni del metodo toString () .

Tutto il codice sorgente di questo articolo è disponibile su GitHub.