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.