Java toString () -metode

1. Oversikt

Hver klasse i Java er et barn av Gjenstand klasse enten direkte eller indirekte. Og siden den Gjenstand klasse inneholder en toString () metode, kan vi ringe toString () i alle tilfeller og få strengrepresentasjonen.

I denne opplæringen vil vi se på standard oppførsel av toString () og lære hvordan du kan endre oppførselen.

2. Standard atferd

Når vi skriver ut en objektreferanse, påkaller den toString () metode internt. Så hvis vi ikke definerer en toString () metode i klassen vår, da Gjenstand#toString () påberopes.

ObjekttoString () metoden er ganske generisk:

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

For å se hvordan dette fungerer, la oss lage en Kunde objekt som vi bruker gjennom hele opplæringen:

offentlig klasse kunde {privat streng fornavn; privat streng etternavn; // standard getters og setters. Ingen toString () implementering}

Nå, hvis vi prøver å skrive ut vår Ckunden gjenstand, Gjenstand#toString () vil bli kalt, og utgangen vil være lik:

[e-postbeskyttet]

3. Overstyring av standard atferd

Ser vi på utdataene ovenfor, kan vi se at det ikke gir oss mye informasjon om innholdet i vårt Kunde gjenstand. Generelt er vi ikke interessert i å vite hashkoden til et objekt, men snarere innholdet i objektets attributter.

Ved å overstyre standardoppførselen til toString () metode, kan vi gjøre resultatet av metoden samtale mer meningsfylt.

La oss nå se på noen forskjellige scenarier ved hjelp av objekter for å se hvordan vi kan overstyre denne standardoppførselen.

4. Primitive typer og Strenger

Våre Kunde objektet har begge deler String og primitive attributter. Vi må overstyre toString () metode for å oppnå en mer meningsfull produksjon:

offentlig klasse CustomerPrimitiveToString utvider Kunden {privat lang saldo; @Override public String toString () {return "Customer [balance =" + balance + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]"; }} 

La oss se hva vi får når vi ringer toString () nå:

@Test offentlig ugyldig givenPrimitive_whenToString_thenCustomerDetails () {CustomerPrimitiveToString customer = new CustomerPrimitiveToString (); customer.setFirstName ("Rajesh"); customer.setLastName ("Bhojwani"); customer.setBalance (110); assertEquals ("Kunde [balanse = 110, getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

5. Komplekse Java-objekter

La oss nå vurdere et scenario der vårt Kunde objektet inneholder også et rekkefølge attributt som er av typen Rekkefølge. Våre Rekkefølge klasse har begge deler String og primitive datatypefelt.

Så la oss overstyre toString () en gang til:

offentlig klasse CustomerComplexObjectToString utvider kunden {privat bestillingsordre; // standard setters og getters @Override public String toString () {return "Customer [order =" + order + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "] "; }}

Siden rekkefølge er et komplekst objekt, hvis vi bare skriver ut vår Kunde objekt, uten å overstyre toString () metode i vår Rekkefølge klasse, vil den skrives ut ordrene som [e-postbeskyttet].

For å fikse det, la oss overstyre toString () i Rekkefølgeogså:

public class Order {private String orderId; private String desc; privat lang verdi; privat strengstatus; @ Override public String toString () {return "Order [orderId =" + orderId + ", desc =" + desc + ", value =" + value + "]"; }} 

La oss nå se hva som skjer når vi kaller toString () metode på vår Kunde objekt som inneholder et rekkefølge Egenskap:

@Test offentlig ugyldig givenComplex_whenToString_thenCustomerDetails () {CustomerComplexObjectToString customer = new CustomerComplexObjectToString (); // .. sette opp kunde som før Bestillingsordre = ny Bestilling (); order.setOrderId ("A1111"); order.setDesc ("Spill"); order.setStatus ("Innlevering"); customer.setOrders (bestilling); assertEquals ("Customer [order = Order [orderId = A1111, desc = Game, value = 0]," + "getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

6. Array of Objects

Neste, la oss endre vår Kunde å ha en rekke Rekkefølges. Hvis vi bare skriver ut vår Kunde objekt, uten spesiell håndtering for vår ordrene objektet, vil det skrives ut ordrene som Rekkefølge;@.

For å fikse det, la oss bruke Arrays.toString () for ordrene felt:

offentlig klasse CustomerArrayToString utvider kunde {private ordre [] bestillinger; @ Override public String toString () {return "Customer [orders =" + Arrays.toString (orders) + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]" ; }} 

La oss se resultatene av å ringe ovennevnte toString () metode:

@Test offentlig ugyldig givenArray_whenToString_thenCustomerDetails () {CustomerArrayToString-kunde = ny CustomerArrayToString (); // .. sette opp kunde som før // .. sette opp ordre som før customer.setOrders (ny ordre [] {ordre}); assertEquals ("Customer [orders = [Order [orderId = A1111, desc = Game, value = 0]]," + "getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

7. Pakkere, samlinger og StringBuffers

Når et objekt består av innpakninger, samlinger eller StringBuffers, ingen skikk toString () implementering er nødvendig fordi disse objektene allerede har overstyrt toString () metode med meningsfulle representasjoner:

offentlig klasse CustomerWrapperCollectionToString utvider Kundens {private Integer score; // Wrapper class objekt private Listeordrer; // Samlingsobjekt privat StringBuffer fullt navn; // StringBuffer-objekt @ Override offentlig String toString () {return "Kunde [score =" + score + ", ordrer =" + ordrer + ", fullnavn =" + fullnavn + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]"; }} 

La oss igjen se resultatene av å ringe toString ():

@Test offentlig ugyldig givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails () {CustomerWrapperCollectionToString customer = new CustomerWrapperCollectionToString (); // .. sette opp kunde som før // .. sette opp ordrer som før customer.setOrders (ny ordre [] {ordre}); StringBuffer fullnavn = ny StringBuffer (); fullname.append (customer.getLastName () + "," + customer.getFirstName ()); assertEquals ("Kunden [score = 8, ordrer = [Bok, penn], fullnavn = Bhojwani, Rajesh, getFirstName () = Rajesh," + "getLastName () = Bhojwani]", customer.toString ()); }

8. Konklusjon

I denne artikkelen så vi på å lage våre egne implementeringer av toString () metode.

All kildekoden for denne artikkelen er tilgjengelig på GitHub.


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