Metoda Java toString ()

1. Pregled

Svaki je razred na Javi dijete od Objekt razred bilo izravno ili neizravno. A od Objekt razred sadrži a toString () metodu, možemo nazvati toString () na bilo kojoj instanci i dobiti njegov niz prikaz.

U ovom uputstvu pogledat ćemo zadano ponašanje od toString () i naučiti kako promijeniti njegovo ponašanje.

2. Zadano ponašanje

Kad god ispisujemo referencu na objekt, ona poziva na toString () metoda interno. Dakle, ako ne definiramo a toString () metoda u našem razredu, dakle Objekt#toString () se poziva.

ObjekttoString () metoda je prilično generička:

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

Da bismo vidjeli kako ovo funkcionira, stvorimo a Kupac objekt koji ćemo koristiti tijekom našeg vodiča:

kupac javne klase {private String firstName; private String lastName; // standardni geteri i postavljači. Bez implementacije toString ()}

Ako pokušamo ispisati naš Customer objekt, Objekt#toString () će biti pozvan, a izlaz će biti sličan:

[e-pošta zaštićena]

3. Nadjačavanje zadanog ponašanja

Gledajući gornji izlaz, možemo vidjeti da nam on ne daje puno informacija o sadržaju našeg Kupac objekt. Općenito, ne zanima nas hashcode objekta, već sadržaj njegovih atributa.

Nadjačavanjem zadanog ponašanja datoteke toString () metodu, izlaz rezultata poziva možemo učiniti značajnijim.

Sada, pogledajmo nekoliko različitih scenarija pomoću objekata kako bismo vidjeli kako možemo nadjačati ovo zadano ponašanje.

4. Primitivne vrste i Žice

Naše Kupac objekt ima oboje Niz i primitivni atributi. Moramo nadjačati toString () metoda za postizanje značajnijeg rezultata:

javna klasa CustomerPrimitiveToString proširuje kupca {privatno dugo stanje; @Override public String toString () {return "Kupac [balance =" + saldo + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]"); }} 

Pogledajmo što ćemo dobiti kad nazovemo toString () sada:

@Test javna praznina givenPrimitive_whenToString_thenCustomerDetails () {CustomerPrimitiveToString kupac = novi CustomerPrimitiveToString (); customer.setFirstName ("Rajesh"); customer.setLastName ("Bhojwani"); kupac.setBalance (110); assertEquals ("Kupac [stanje = 110, getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

5. Složeni Java objekti

Razmotrimo sada scenarij u kojem naš Kupac objekt također sadrži narudžba atribut koji je tipa Narudžba. Naše Narudžba razred ima oboje Niz i primitivna polja tipa podataka.

Dakle, poništimo toString () opet:

javna klasa CustomerComplexObjectToString proširuje kupca {narudžba privatne narudžbe; // standardni postavljači i getteri @Override javni niz toString () {return "Kupac [nalog =" + nalog + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "] "; }}

Od narudžba je složeni objekt, ako samo ispišemo svoje Kupac objekt, bez poništavanja toString () metoda u našem Narudžba klase, ispisat će se naredbe kao [e-mail zaštićen].

Da to popravimo, poništimo toString () u Narudžba, isto:

nalog javne klase {private String orderId; privatni niz desc; privatna duga vrijednost; status privatnog niza; @Override public String toString () {return "Order [orderId =" + orderId + ", desc =" + desc + ", value =" + value + "]"; }} 

Sad, da vidimo što će se dogoditi kad nazovemo toString () metoda na našem Kupac objekt koji sadrži narudžba atribut:

@Test javna praznina givenComplex_whenToString_thenCustomerDetails () {CustomerComplexObjectToString kupac = novi CustomerComplexObjectToString (); // .. postaviti kupca kao prije Narudžba narudžba = nova narudžba (); order.setOrderId ("A1111"); order.setDesc ("Igra"); order.setStatus ("U isporuci"); customer.setOrders (narudžba); assertEquals ("Kupac [order = Order [orderId = A1111, desc = Game, value = 0]," + "getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

6. Niz predmeta

Dalje, promijenimo svoje Kupac imati niz od Narudžbas. Ako samo ispišemo svoje Kupac objekt, bez posebnog rukovanja za naše naredbe objekt, ispisat će naredbe kao Narudžba;@.

Da to popravimo iskoristimo Nizovi.toString () za naredbe polje:

javna klasa CustomerArrayToString proširuje narudžbe kupaca {private Order []; @Override public String toString () {return "Kupac [narudžbe =" + Arrays.toString (naloga) + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]") ; }} 

Pogledajmo rezultate pozivanja gore navedenog toString () metoda:

@Test javna praznina givenArray_whenToString_thenCustomerDetails () {CustomerArrayToString kupac = novi CustomerArrayToString (); // .. postaviti kupca kao prije // .. postaviti nalog kao i prije customer.setOrders (nova narudžba [] {narudžba}); assertEquals ("Kupac [narudžbe = [Narudžba [orderId = A1111, desc = Igra, vrijednost = 0]]," + "getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

7. Omotači, zbirke i StringBuffers

Kada se objekt u potpunosti sastoji od omota, zbirki ili StringBuffers, nema običaja toString () potrebna je implementacija jer su ti objekti već nadjačali toString () metoda sa smislenim prikazima:

javna klasa CustomerWrapperCollectionToString proširuje Customer {private Integer score; // Objekt klase omotača privatni popisi naloga; // privatni objekt zbirke StringBuffer puno ime; // StringBuffer objekt @Override javni String toString () {return "Kupac [rezultat =" + rezultat + ", nalozi =" + nalozi + ", puno ime =" + puno ime + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]"; }} 

Pogledajmo ponovno rezultate pozivanja toString ():

@Test javna praznina givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails () {CustomerWrapperCollectionToString kupac = nova CustomerWrapperCollectionToString (); // .. postaviti kupca kao prije // .. postaviti narudžbe kao i prije customer.setOrders (nova narudžba [] {narudžba}); StringBuffer puno ime = novi StringBuffer (); puno ime.append (customer.getLastName () + "," + customer.getFirstName ()); assertEquals ("Kupac [rezultat = 8, narudžbe = [Knjiga, Olovka], puno ime = Bhojwani, Rajesh, getFirstName () = Rajesh," + "getLastName () = Bhojwani]", customer.toString ()); }

8. Zaključak

U ovom smo članku pogledali stvaranje vlastitih implementacija toString () metoda.

Sav izvorni kod za ovaj članak dostupan je na GitHubu.