Метод Java toString ()

1. Общ преглед

Всеки клас в Java е подчинен на клас Object, пряко или косвено. И тъй като класът Object съдържа метод toString () , можем да извикаме toString () на всеки екземпляр и да получим неговото представяне на низове.

В този урок ще разгледаме поведението по подразбиране на toString () и ще научим как да променим поведението му.

2. Поведение по подразбиране

Винаги, когато отпечатваме препратка към обект, той вътрешно извиква метода toString () . Така че, ако не дефинираме метод toString () в нашия клас, тогава се извиква Object # toString () .

Методът toString () на обекта е доста общ:

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

За да видим как работи това, нека създадем обект на клиента , който ще използваме в нашия урок:

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

Сега, ако се опитаме да отпечатаме нашия обект C ustomer , ще бъде извикан Object # toString () и изходът ще бъде подобен на:

[email protected]

3. Замяна на поведението по подразбиране

Разглеждайки горния изход, можем да видим, че той не ни дава много информация за съдържанието на обекта ни Клиент . Като цяло не се интересуваме от знанието на хеш кода на обект, а по-скоро от съдържанието на атрибутите на нашия обект.

Като заменим поведението по подразбиране на метода toString () , можем да направим изхода на извикването на метода по-смислен.

Сега, нека разгледаме няколко различни сценария, използващи обекти, за да видим как можем да заменим това поведение по подразбиране.

4. Примитивни типове и низове

Нашият обект Клиент има както String, така и примитивни атрибути. Трябва да заменим метода toString () , за да постигнем по-смислен резултат:

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

Нека да видим какво получаваме, когато извикаме toString () сега:

@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. Сложни Java обекти

Нека сега разгледаме сценарий, при който обектът ни клиент също съдържа атрибут за поръчка , който е от тип Поръчка. Нашият клас Order има както поле String, така и примитивен тип данни.

И така, нека отново да заменим 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() + "]"; } }

Тъй като поръчката е сложен обект , ако просто отпечатаме обекта си Клиент , без да заменим метода toString () в нашия клас Order , той ще отпечата поръчки като [имейл защитен].

За да поправим това, нека да заменим и toString () в Order :

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 + "]"; } } 

Сега нека да видим какво се случва, когато извикаме метода toString () в обекта ни Customer, който съдържа атрибут order :

@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. Масив от обекти

На следващо място, нека да променят нашия Клиент да има набор от Ред и . Ако просто отпечатаме обекта на клиента , без специално обработване за обекта ни за поръчки , той ще отпечата поръчки като Поръчка; @ .

За да коригираме това, нека използваме Arrays.toString () за полето за поръчки :

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

Нека да видим резултатите от извикването на горния метод toString () :

@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. Опаковки, колекции и StringBuffers

Когато обектът е съставен изцяло от обвивки, колекции или StringBuffer s, не се изисква изпълнение по поръчка toString () , тъй като тези обекти вече са заменили метода toString () със значими представяния:

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() + "]"; } } 

Нека отново видим резултатите от извикването на toString () :

@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. Заключение

В тази статия разгледахме създаването на собствени реализации на метода toString () .

Целият изходен код за тази статия е достъпен в GitHub.