Java toString () metode

1. Oversigt

Hver klasse i Java er et barn af Objekt klasse enten direkte eller indirekte. Og siden den Objekt klasse indeholder en toString () metode, kan vi ringe til toString () i ethvert tilfælde og få dets strengrepræsentation.

I denne vejledning ser vi på standardadfærd for toString () og lære at ændre dens adfærd.

2. Standardadfærd

Hver gang vi udskriver en objektreference, påberåber den sig toString () metode internt. Så hvis vi ikke definerer en toString () metode i vores klasse Objekt#toString () påberåbes.

Objekt ertoString () metoden er ret generisk:

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

Lad os oprette en for at se, hvordan dette fungerer Kunde objekt, som vi bruger i hele vores tutorial:

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

Nu, hvis vi prøver at udskrive vores Ckunde objekt, Objekt#toString () kaldes, og output svarer til:

[e-mail beskyttet]

3. Tilsidesættelse af standardadfærd

Når vi ser på ovenstående output, kan vi se, at det ikke giver os meget information om indholdet af vores Kunde objekt. Generelt er vi ikke interesserede i at kende hashkoden for et objekt, men snarere indholdet af vores objekts attributter.

Ved at tilsidesætte standardadfærden for toString () metode, kan vi gøre output af metodekaldet mere meningsfuldt.

Lad os nu se på et par forskellige scenarier ved hjælp af objekter for at se, hvordan vi kan tilsidesætte denne standardadfærd.

4. Primitive typer og Strenge

Vores Kunde objekt har begge dele Snor og primitive egenskaber. Vi er nødt til at tilsidesætte toString () metode til at opnå en mere meningsfuld produktion:

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

Lad os se, hvad vi får, når vi ringer toString () nu:

@Test offentlig ugyldighed givenPrimitive_whenToString_thenCustomerDetails () {CustomerPrimitiveToString-kunde = ny CustomerPrimitiveToString (); customer.setFirstName ("Rajesh"); customer.setLastName ("Bhojwani"); customer.setBalance (110); assertEquals ("Kunde [balance = 110, getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

5. Komplekse Java-objekter

Lad os nu overveje et scenario, hvor vores Kunde objekt indeholder også en bestille attribut, der er af typen Bestille. Vores Bestille klasse har begge dele Snor og primitive datatypefelter.

Så lad os tilsidesætte toString () igen:

offentlig klasse CustomerComplexObjectToString udvider kunde {privat ordreordre; // standard setter og getters @Override public String toString () {return "Customer [order =" + order + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "] "; }}

Siden bestille er et komplekst objekt, hvis vi bare udskriver vores Kunde objekt uden at tilsidesætte toString () metode i vores Bestille klasse, udskrives den Ordre:% s som [e-mail-beskyttet].

For at rette det, lad os tilsidesætte toString () i Bestille, også:

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

Lad os nu se, hvad der sker, når vi kalder toString () metode på vores Kunde objekt, der indeholder et bestille attribut:

@Test offentligt ugyldigt givenComplex_whenToString_thenCustomerDetails () {CustomerComplexObjectToString customer = new CustomerComplexObjectToString (); // .. oprette kunde som før Ordreordre = ny ordre (); order.setOrderId ("A1111"); order.setDesc ("Spil"); order.setStatus ("Forsendelse"); customer.setOrders (ordre); assertEquals ("Kunde [ordre = Ordre [orderId = A1111, desc = Spil, værdi = 0]," + "getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

6. Array of Objects

Lad os derefter ændre vores Kunde at have en række Bestilles. Hvis vi bare udskriver vores Kunde objekt uden særlig håndtering for vores Ordre:% s objekt, udskrives det Ordre:% s som Bestille;@.

For at ordne det, lad os bruge Arrays.toString () til Ordre:% s Mark:

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

Lad os se resultaterne af at kalde ovenstående toString () metode:

@Test offentlig ugyldighed givenArray_whenToString_thenCustomerDetails () {CustomerArrayToString-kunde = ny CustomerArrayToString (); // .. oprette kunde som før // .. oprette ordre som før customer.setOrders (ny ordre [] {ordre}); assertEquals ("Kunde [ordrer = [Ordre [orderId = A1111, desc = Spil, værdi = 0]]," + "getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

7. Indpakninger, samlinger og StringBuffers

Når et objekt udelukkende består af indpakninger, samlinger eller StringBuffers, ingen skik toString () implementering er påkrævet, fordi disse objekter allerede har tilsidesat toString () metode med meningsfulde repræsentationer:

offentlig klasse CustomerWrapperCollectionToString udvider kunde {privat heltal score; // Wrapper klasse objekt private Listeordrer; // Samlingsobjekt privat StringBuffer fulde navn; // StringBuffer-objekt @ Override offentlig String toString () {return "Kunde [score =" + score + ", ordrer =" + ordrer + ", fuldnavn =" + fuldnavn + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]"; }} 

Lad os igen se resultaterne af at ringe toString ():

@Test offentlig ugyldighed givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails () {CustomerWrapperCollectionToString kunde = ny CustomerWrapperCollectionToString (); // .. oprette kunde som før // .. oprette ordrer som før customer.setOrders (ny ordre [] {ordre}); StringBuffer fuldnavn = ny StringBuffer (); fuldnavn.append (customer.getLastName () + "," + customer.getFirstName ()); assertEquals ("Kunde [score = 8, ordrer = [Bog, pen], fuldnavn = Bhojwani, Rajesh, getFirstName () = Rajesh," + "getLastName () = Bhojwani]", customer.toString ()); }

8. Konklusion

I denne artikel så vi på at skabe vores egne implementeringer af toString () metode.

Al kildekoden til denne artikel er tilgængelig på GitHub.


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