Java toString () metódus

1. Áttekintés

A Java minden osztálya a Tárgy osztályba közvetlenül vagy közvetve. És mivel a Tárgy osztály tartalmazza a toString () módszerrel hívhatunk toString () tetszőleges példányon, és megkapja a karakterlánc-ábrázolását

Ebben az oktatóanyagban megnézzük a alapértelmezett viselkedése toString () és megtanulják, hogyan lehet megváltoztatni viselkedését.

2. Alapértelmezett viselkedés

Amikor objektum hivatkozást nyomtatunk, az meghívja a toString () módszer belsőleg. Tehát, ha nem definiálunk a toString () módszer az osztályunkban Tárgy#toString () hivatkozik.

TárgyaktoString () a módszer elég általános:

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

Hogy lássuk, hogyan működik ez, hozzunk létre egy Vevő objektum, amelyet az oktatóanyagunk során használunk:

public class Ügyfél {private String keresztnév; privát karakterlánc vezetéknév; // szokásos getterek és beállítók. No toString () implementáció}

Most, ha megpróbáljuk kinyomtatni a Customer tárgy, Tárgy#toString () és a kimenet hasonló lesz:

[e-mail védett]

3. Az alapértelmezett viselkedés felülbírálása

A fenti kimenetet megnézve láthatjuk, hogy nem sok információt ad a tartalmunkról Vevő tárgy. Általában nem egy objektum hashkódjának, hanem az objektum attribútumainak tartalmának a megismerése érdekel minket.

A. Alapértelmezett viselkedésének felülbírálásával toString () módszerrel értelmesebbé tehetjük a metódus kimenetét.

Most nézzünk meg néhány különböző forgatókönyvet az objektumok használatával, hogy lássuk, hogyan tudjuk felülírni ezt az alapértelmezett viselkedést.

4. Primitív típusok és Húrok

A mi Vevő objektum mindkettő Húr és primitív attribútumok. Felül kell írnunk a toString () módszer az értelmesebb kimenet eléréséhez:

public class CustomerPrimitiveToString kiterjeszti az Ügyfél {private long balance; @Orride public String toString () {return "Ügyfél [egyenleg =" + egyenleg + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]"; }} 

Lássuk, mit kapunk, amikor hívunk toString () Most:

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

5. Komplex Java objektumok

Vizsgáljuk meg most azt a forgatókönyvet, ahol a mi Vevő objektum tartalmaz egy rendelés típusú attribútum Rendelés. A mi Rendelés osztályban van mindkettő Húr és primitív adattípus mezők.

Tehát, írjuk felül toString () újra:

public class CustomerComplexObjectToString kiterjeszti az Ügyfél {magánrendelés megrendelését; // szabványos beállítók és szerzők @Orride public String toString () {return "Ügyfél [megrendelés =" + megrendelés + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "] "; }}

Mivel rendelés összetett tárgy, ha csak kinyomtatjuk a mi Vevő objektum, anélkül, hogy felülírná a toString () módszer a mi Rendelés osztályban, kinyomtatja megrendelések mint [e-mail védett].

Ennek kijavításához írjuk felül toString () ban ben Rendelés, is:

public class Rendelés {private String orderId; privát String desc; hosszú magánérték; privát húr státusz; @Orride public String toString () {return "Order [orderId =" + orderId + ", desc =" + desc + ", value =" + value + "]"; }} 

Most nézzük meg, mi történik, amikor felhívjuk a toString () módszer a mi Vevő objektum, amely egy rendelés tulajdonság:

@Test public void givenComplex_whenToString_thenCustomerDetails () {CustomerComplexObjectToString customer = new CustomerComplexObjectToString (); // .. beállítja az ügyfelet, mint korábban Megrendelés = új Megrendelés (); order.setOrderId ("A1111"); order.setDesc ("Játék"); order.setStatus ("In-Shiping"); customer.setOrders (megrendelés); assertEquals ("Ügyfél [megrendelés = Rendelés [megrendelésId = A1111, desc = Játék, érték = 0]," + "getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

6. Tárgyak tömbje

Ezután változtassunk Vevő hogy legyen egy tömbje Rendeléss. Ha csak kinyomtatjuk Vevő objektum, külön kezelés nélkül megrendelések objektumot, kinyomtatja megrendelések mint Rendelés;@.

Ennek kijavítására használjuk Arrays.toString () a megrendelések terület:

public class CustomerArrayToString kiterjeszti az Ügyfél {private Order [] megrendeléseit; @Orride public String toString () {return "Ügyfél [megrendelések =" + Tömbök.String (megrendelések) + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]" ; }} 

Lássuk a fentiek hívásának eredményeit toString () módszer:

@Test public void givenArray_whenToString_thenCustomerDetails () {CustomerArrayToString customer = new CustomerArrayToString (); // .. az ügyfél beállítása, mint korábban // .. a megrendelés beállítása, mint korábban customer.setOrders (új megrendelés [] {order}); assertEquals ("Ügyfél [megrendelések = [Rendelés [orderId = A1111, desc = Játék, érték = 0]]," + "getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

7. Csomagolók, gyűjtemények és StringBuffers

Amikor egy tárgy teljes egészében csomagolókból, gyűjteményekből vagy StringBuffers, nincs szokás toString () megvalósításra van szükség, mert ezek az objektumok már felülbírálták a toString () módszer értelmes ábrázolásokkal:

public class CustomerWrapperCollectionToString kiterjeszti az Ügyfél {privát egész számát; // Wrapper osztály objektum privát Lista megrendelések; // Gyűjteményobjektum privát StringBuffer teljes neve; // StringBuffer objektum @Orride public String toString () {return "Ügyfél [score =" + score + ", megbízások =" + megbízások + ", teljes név =" + teljes név + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]"; }} 

Lássuk újra a hívás eredményét toString ():

@Test public void givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails () {CustomerWrapperCollectionToString customer = new CustomerWrapperCollectionToString (); // .. ügyfél beállítása, mint korábban // .. megrendelések beállítása, mint korábban customer.setOrders (új megrendelés [] {order}); StringBuffer teljes neve = new StringBuffer (); teljes név.append (customer.getLastName () + "," + customer.getFirstName ()); assertEquals ("Ügyfél [pontszám = 8, megrendelések = [Könyv, Toll], teljes név = Bhojwani, Rajesh, getFirstName () = Rajesh," + "getLastName () = Bhojwani]", customer.toString ()); }

8. Következtetés

Ebben a cikkben megvizsgáltuk a saját implementációk létrehozását toString () módszer.

A cikk összes forráskódja elérhető a GitHubon.