Metóda Java toString ()

1. Prehľad

Každá trieda v Jave je dieťaťom Objekt triedy buď priamo, alebo nepriamo. A keďže Objekt trieda obsahuje a natiahnuť() metóda, môžeme zavolať natiahnuť() v ľubovoľnom prípade a získajte jeho reťazcové zastúpenie.

V tomto výučbe sa pozrieme na predvolené správanie servera natiahnuť() a naučiť sa, ako zmeniť svoje správanie.

2. Predvolené správanie

Kedykoľvek tlačíme referenciu na objekt, vyvolá sa natiahnuť() metóda interne. Ak teda nedefinujeme a natiahnuť() metódou v našej triede Objekt #natiahnuť() je vyvolaná.

Objektnatiahnuť() metóda je dosť všeobecná:

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

Aby sme videli, ako to funguje, vytvorme a Zákazník objekt, ktorý budeme používať v celom našom výučbe:

verejná trieda Zákazník {private String firstName; private String priezvisko; // štandardné getre a setre. Žiadna implementácia toString ()}

Teraz, ak sa pokúsime vytlačiť naše C.ustomer objekt, Objekt#natiahnuť() sa bude volať a výstup bude podobný ako:

[chránené e-mailom]

3. Prepísanie predvoleného správania

Pri pohľade na vyššie uvedený výstup vidíme, že nám neposkytuje veľa informácií o obsahu nášho Zákazník objekt. Všeobecne nás nezaujíma poznanie hašovacieho kódu objektu, ale skôr obsah atribútov nášho objektu.

Prepísaním predvoleného správania súboru natiahnuť() metódou, môžeme urobiť výstup volania metódy zmysluplnejším.

Teraz sa pozrime na niekoľko rôznych scenárov pomocou objektov, aby sme zistili, ako môžeme toto predvolené správanie prepísať.

4. Primitívne typy a Struny

Náš Zákazník objekt má oboje String a primitívne atribúty. Musíme prekonať natiahnuť() metóda na dosiahnutie zmysluplnejšieho výstupu:

public class CustomerPrimitiveToString rozširuje Customer {private long balance; @Override public String toString () {return "Zákazník [balance =" + balance + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]"; }} 

Pozrime sa, čo dostaneme, keď zavoláme natiahnuť() teraz:

@Test public void givenPrimitive_whenToString_thenCustomerDetails () {CustomerPrimitiveToString customer = new CustomerPrimitiveToString (); customer.setFirstName ("Rajesh"); customer.setLastName ("Bhojwani"); customer.setBalance (110); assertEquals ("Zákazník [zostatok = 110, getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

5. Zložité objekty Java

Uvažujme teraz o scenári, kde náš Zákazník objekt obsahuje aj objednať atribút, ktorý je typu Objednať. Náš objednať trieda má oboje String a primitívne polia údajových typov.

Poďme to teda prekonať natiahnuť() ešte raz:

verejná trieda CustomerComplexObjectToString rozširuje zákazníka {súkromná objednávka objednávky; // štandardní zakladatelia a obstarávatelia @Override public String toString () {return "Customer [order =" + order + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "] "; }}

Odkedy objednať je komplexný objekt, keby sme len vytlačili naše Zákazník objekt bez toho, aby zrušil natiahnuť() metóda v našom objednať triedy, vypíše objednávky ako [chránené e-mailom].

Aby sme to napravili, prepíšeme to natiahnuť() v objednať, tiež:

public class Order {private String orderId; private String desc; súkromná dlhá hodnota; stav súkromného reťazca; @Override public String toString () {return "Order [orderId =" + orderId + ", desc =" + desc + ", value =" + value + "]"; }} 

Teraz sa pozrime, čo sa stane, keď zavoláme natiahnuť() metóda na našom Zákazník objekt, ktorý obsahuje objednať atribút:

@Test public void givenComplex_whenToString_thenCustomerDetails () {CustomerComplexObjectToString customer = new CustomerComplexObjectToString (); // .. nastaviť zákazníka ako pred Objednávka objednávky = nová Objednávka (); order.setOrderId ("A1111"); order.setDesc („Hra“); order.setStatus ("Pri dodaní"); customer.setOrders (objednávka); assertEquals ("Zákazník [objednávka = objednávka [orderId = A1111, desc = hra, hodnota = 0]," + "getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

6. Pole objektov

Ďalej zmeňme naše Zákazník mať pole objednaťs. Keby sme si len vytlačili naše Zákazník objekt, bez zvláštneho zaobchádzania pre naše objednávky objekt, vypíše sa objednávky ako Objednať;@.

Aby sme to napravili, použijeme to Arrays.toString () pre objednávky lúka:

verejná trieda CustomerArrayToString rozširuje zákaznícke {súkromné ​​objednávky [] objednávky; @Override public String toString () {návrat "Zákazník [objednávky =" + Arrays.toString (objednávky) + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]" " ; }} 

Pozrime sa na výsledky volania vyššie natiahnuť() metóda:

@Test public void givenArray_whenToString_thenCustomerDetails () {CustomerArrayToString customer = new CustomerArrayToString (); // .. nastaviť zákazníka ako predtým // .. nastaviť objednávku ako predtým customer.setOrders (nová objednávka [] {objednávka}); assertEquals ("Zákazník [objednávky = [Objednávka [orderId = A1111, desc = Hra, hodnota = 0]]," + "getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

7. Obaly, zbierky a StringBuffers

Keď je objekt úplne vyrobený z obalov, zbierok alebo StringBuffers, žiadny zvyk natiahnuť() implementácia sa vyžaduje, pretože tieto objekty už prekonali natiahnuť() metóda so zmysluplnými znázorneniami:

public class CustomerWrapperCollectionToString rozširuje Customer {private Integer score; // súkromné ​​objekty triedy wrapper Zoznam objednávok; // Objekt zbierky private StringBuffer fullname; // Objekt StringBuffer @Override public String toString () {návrat "Zákazník [skóre =" + skóre + ", objednávky =" + objednávky + ", celé meno =" + celé meno + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]"; }} 

Pozrime sa znova na výsledky volania natiahnuť():

@Test public void givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails () {CustomerWrapperCollectionToString customer = new CustomerWrapperCollectionToString (); // .. nastaviť zákazníka ako predtým // .. nastaviť objednávky ako pred zákazníkom.setOrders (nová objednávka [] {objednávka}); Celé meno StringBuffer = nový StringBuffer (); fullname.append (customer.getLastName () + "," + customer.getFirstName ()); assertEquals ("Zákazník [skóre = 8, objednávky = [Kniha, Pero], celé meno = Bhojwani, Rajesh, getFirstName () = Rajesh," + "getLastName () = Bhojwani]", customer.toString ()); }

8. Záver

V tomto článku sme sa zaoberali vytváraním vlastných implementácií natiahnuť() metóda.

Celý zdrojový kód tohto článku je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found