Java toString () - methode

1. Overzicht

Elke klas in Java is een kind van de Voorwerp klasse direct of indirect. En sinds de Voorwerp klasse bevat een toString () methode, kunnen we bellen toString () op elk exemplaar en verkrijg de tekenreeksweergave.

In deze tutorial kijken we naar de standaardgedrag van toString () en leer hoe je zijn gedrag kunt veranderen.

2. Standaardgedrag

Elke keer dat we een objectreferentie afdrukken, roept het de toString () methode intern. Dus als we een toString () methode in onze klas, dan Voorwerp#toString () wordt aangeroepen.

VoorwerpentoString () methode is vrij algemeen:

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

Laten we een Klant object dat we in onze tutorial zullen gebruiken:

openbare klasse Klant {private String firstName; private String achternaam; // standaard getters en setters. Geen toString () implementatie}

Nu, als we proberen onze Customer voorwerp, Voorwerp#toString () wordt aangeroepen en de uitvoer zal er ongeveer zo uitzien:

[e-mail beveiligd]

3. Standaardgedrag overschrijven

Als we naar de bovenstaande uitvoer kijken, kunnen we zien dat het ons niet veel informatie geeft over de inhoud van ons Klant voorwerp. Over het algemeen zijn we niet geïnteresseerd in het kennen van de hashcode van een object, maar in de inhoud van de attributen van ons object.

Door het standaardgedrag van het toString () methode, kunnen we de uitvoer van de methodeaanroep zinvoller maken.

Laten we nu eens kijken naar een paar verschillende scenario's waarbij objecten worden gebruikt om te zien hoe we dit standaardgedrag kunnen opheffen.

4. Primitieve typen en Snaren

Onze Klant object heeft beide Draad en primitieve attributen. We moeten het toString () methode om een ​​meer betekenisvolle output te bereiken:

public class CustomerPrimitiveToString verlengt Customer {private long balance; @Override public String toString () {return "Customer [balance =" + balance + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]"; }} 

Laten we eens kijken wat we krijgen als we bellen toString () nu:

@Test openbare ongeldige gegevenPrimitive_whenToString_thenCustomerDetails () {CustomerPrimitiveToString klant = nieuwe CustomerPrimitiveToString (); customer.setFirstName ("Rajesh"); customer.setLastName ("Bhojwani"); customer.setBalance (110); assertEquals ("Klant [saldo = 110, getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

5. Complexe Java-objecten

Laten we nu eens kijken naar een scenario waarin onze Klant object bevat ook een bestellen attribuut dat van het type is Bestellen. Onze Bestellen klasse heeft beide Draad en primitieve datatypevelden.

Dus laten we overschrijven toString () opnieuw:

openbare klasse CustomerComplexObjectToString verlengt {privéorderbestelling van klant; // standaard setters en getters @Override public String toString () {return "Customer [order =" + order + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "] "; }}

Sinds bestellen is een complex object, als we gewoon onze Klant object, zonder de toString () methode in onze Bestellen klasse, het wordt afgedrukt bestellingen net zo [e-mail beveiligd].

Om dat op te lossen, laten we overschrijven toString () in Bestellenook:

openbare klasse Order {private String orderId; private String desc; privé lange waarde; privé String-status; @Override public String toString () {return "Order [orderId =" + orderId + ", desc =" + desc + ", value =" + waarde + "]"; }} 

Laten we nu eens kijken wat er gebeurt als we het toString () methode op onze Klant object dat een bestellen attribuut:

@Test openbare ongeldig gegevenComplex_whenToString_thenCustomerDetails () {CustomerComplexObjectToString klant = nieuwe CustomerComplexObjectToString (); // .. klant instellen zoals voorheen Order order = new Order (); order.setOrderId ("A1111"); order.setDesc ("Game"); order.setStatus ("In-Shiping"); customer.setOrders (bestelling); assertEquals ("Customer [order = Order [orderId = A1111, desc = Game, value = 0]," + "getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

6. Array van objecten

Laten we vervolgens onze wijzigen Klant om een ​​reeks te hebben van Bestellens. Als we gewoon onze Klant object, zonder speciale behandeling voor onze bestellingen object, zal het afdrukken bestellingen net zo Bestellen;@.

Om dat op te lossen, gebruiken we Arrays.toString () voor de bestellingen veld:

openbare klasse CustomerArrayToString verlengt klant {privéorder [] bestellingen; @Override public String toString () {return "Customer [orders =" + Arrays.toString (orders) + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]" ; }} 

Laten we eens kijken naar de resultaten van het aanroepen van het bovenstaande toString () methode:

@Test openbare ongeldige gegevenArray_whenToString_thenCustomerDetails () {CustomerArrayToString klant = nieuwe CustomerArrayToString (); // .. klant instellen zoals voorheen // .. bestelling instellen zoals voorheen customer.setOrders (nieuwe bestelling [] {bestelling}); assertEquals ("Customer [orders = [Order [orderId = A1111, desc = Game, value = 0]]," + "getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

7. Wrappers, verzamelingen en StringBuffers

Wanneer een object volledig bestaat uit wikkels, verzamelingen of StringBuffers, geen gebruik toString () implementatie is vereist omdat deze objecten de toString () methode met betekenisvolle weergaven:

public class CustomerWrapperCollectionToString breidt Customer {private Integer score; // Wrapper class object privé Lijstopdrachten; // Collectieobject privé StringBuffer volledige naam; // StringBuffer-object @Override public String toString () {return "Customer [score =" + score + ", orders =" + orders + ", fullname =" + fullname + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]"; }} 

Laten we nog eens kijken naar de resultaten van bellen toString ():

@Test openbare ongeldige gegevenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails () {CustomerWrapperCollectionToString klant = nieuwe CustomerWrapperCollectionToString (); // .. klant instellen zoals voorheen // .. bestellingen instellen zoals voorheen customer.setOrders (nieuwe bestelling [] {bestelling}); StringBuffer volledige naam = nieuwe StringBuffer (); fullname.append (customer.getLastName () + "," + customer.getFirstName ()); assertEquals ("Klant [score = 8, bestellingen = [Boek, Pen], volledige naam = Bhojwani, Rajesh, getFirstName () = Rajesh," + "getLastName () = Bhojwani]", customer.toString ()); }

8. Conclusie

In dit artikel hebben we gekeken naar het maken van onze eigen implementaties van het toString () methode.

Alle broncode voor dit artikel is beschikbaar op GitHub.