Java toString () -Methode

1. Übersicht

Jede Klasse in Java ist entweder direkt oder indirekt ein untergeordnetes Element der Object- Klasse. Und da die Object- Klasse eine toString () -Methode enthält, können wir toString () für jede Instanz aufrufen und deren Zeichenfolgendarstellung abrufen .

In diesem Tutorial werden wir uns das Standardverhalten von toString () ansehen und lernen, wie man sein Verhalten ändert.

2. Standardverhalten

Immer wenn wir eine Objektreferenz drucken, wird die Methode toString () intern aufgerufen . Wenn wir in unserer Klasse keine toString () -Methode definieren , wird Object # toString () aufgerufen.

Die toString () -Methode von Object ist ziemlich allgemein:

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

Um zu sehen, wie dies funktioniert, erstellen wir ein Kundenobjekt , das wir in unserem Lernprogramm verwenden werden:

public class Customer { private String firstName; private String lastName; // standard getters and setters. No toString() implementation }

Wenn wir nun versuchen , unser drucken C ustomer Objekt, Objekt # toString () aufgerufen wird, und der Ausgang wird ähnlich sein:

[email protected]

3. Überschreiben des Standardverhaltens

Wenn wir uns die obige Ausgabe ansehen, können wir feststellen, dass sie uns nicht viele Informationen über den Inhalt unseres Kundenobjekts gibt . Im Allgemeinen sind wir nicht daran interessiert, den Hashcode eines Objekts zu kennen, sondern den Inhalt der Attribute unseres Objekts.

Durch Überschreiben des Standardverhaltens der toString () -Methode können wir die Ausgabe des Methodenaufrufs aussagekräftiger machen.

Schauen wir uns nun einige verschiedene Szenarien mit Objekten an, um zu sehen, wie wir dieses Standardverhalten überschreiben können.

4. Primitive Typen und Strings

Unser Kundenobjekt hat sowohl String- als auch primitive Attribute. Wir müssen die toString () -Methode überschreiben , um eine aussagekräftigere Ausgabe zu erzielen:

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

Mal sehen, was wir bekommen, wenn wir jetzt toString () aufrufen :

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

5. Komplexe Java-Objekte

Betrachten wir nun ein Szenario, in dem unser Kundenobjekt auch ein Auftragsattribut vom Typ Auftrag enthält. Unsere Order- Klasse enthält sowohl String- als auch primitive Datentypfelder.

Überschreiben wir also noch einmal toString () :

public class CustomerComplexObjectToString extends Customer { private Order order; //standard setters and getters @Override public String toString() { return "Customer [order=" + order + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]"; } }

Da um ein komplexes Objekt ist , wenn wir nur unsere drucken Kunden Objekt, ohne das Überschreiben der toString () Methode in unserer Bestell Klasse, wird es drucken Aufträge als [email protected].

Um dies zu beheben, überschreiben wir toString () auch in der Reihenfolge :

public class Order { private String orderId; private String desc; private long value; private String status; @Override public String toString() { return "Order [orderId=" + orderId + ", desc=" + desc + ", value=" + value + "]"; } } 

Lassen Sie uns nun sehen, was passiert, wenn wir die toString () -Methode für unser Customer- Objekt aufrufen , das ein Auftragsattribut enthält :

@Test public void givenComplex_whenToString_thenCustomerDetails() { CustomerComplexObjectToString customer = new CustomerComplexObjectToString(); // .. set up customer as before Order order = new Order(); order.setOrderId("A1111"); order.setDesc("Game"); order.setStatus("In-Shiping"); customer.setOrders(order); assertEquals("Customer [order=Order [orderId=A1111, desc=Game, value=0], " + "getFirstName()=Rajesh, getLastName()=Bhojwani]", customer.toString()); }

6. Array von Objekten

Als nächstes wollen wir unsere ändern Kunden eine Reihe von haben , bestellen s . Wenn wir nur unser Kundenobjekt ohne besondere Behandlung für unser Bestellobjekt drucken, werden Bestellungen als Bestellung gedruckt ; @ .

Um dies zu beheben, verwenden wir Arrays.toString () für das Auftragsfeld :

public class CustomerArrayToString extends Customer { private Order[] orders; @Override public String toString() { return "Customer [orders=" + Arrays.toString(orders) + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]"; } } 

Sehen wir uns die Ergebnisse des Aufrufs der obigen toString () -Methode an:

@Test public void givenArray_whenToString_thenCustomerDetails() { CustomerArrayToString customer = new CustomerArrayToString(); // .. set up customer as before // .. set up order as before customer.setOrders(new Order[] { order }); assertEquals("Customer [orders=[Order [orderId=A1111, desc=Game, value=0]], " + "getFirstName()=Rajesh, getLastName()=Bhojwani]", customer.toString()); }

7. Wrapper, Sammlungen und StringBuffer

Wenn ein Objekt vollständig aus Wrappern, Sammlungen oder StringBuffern besteht , ist keine benutzerdefinierte toString () - Implementierung erforderlich, da diese Objekte die toString () -Methode bereits mit aussagekräftigen Darstellungen überschrieben haben :

public class CustomerWrapperCollectionToString extends Customer { private Integer score; // Wrapper class object private List orders; // Collection object private StringBuffer fullname; // StringBuffer object @Override public String toString() { return "Customer [score=" + score + ", orders=" + orders + ", fullname=" + fullname + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]"; } } 

Sehen wir uns noch einmal die Ergebnisse des Aufrufs von toString () an :

@Test public void givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails() { CustomerWrapperCollectionToString customer = new CustomerWrapperCollectionToString(); // .. set up customer as before // .. set up orders as before customer.setOrders(new Order[] { order }); StringBuffer fullname = new StringBuffer(); fullname.append(customer.getLastName()+ ", " + customer.getFirstName()); assertEquals("Customer [score=8, orders=[Book, Pen], fullname=Bhojwani, Rajesh, getFirstName()=Rajesh, " + "getLastName()=Bhojwani]", customer.toString()); }

8. Fazit

In diesem Artikel haben wir uns mit der Erstellung eigener Implementierungen der toString () -Methode befasst.

Der gesamte Quellcode für diesen Artikel ist auf GitHub verfügbar.