Phương thức Java toString ()

1. Khái quát chung

Mọi lớp trong Java đều là con của lớp Đối tượng hoặc trực tiếp hoặc gián tiếp. Và vì lớp Object chứa một phương thức toString () , chúng ta có thể gọi toString () trên bất kỳ thể hiện nào và lấy biểu diễn chuỗi của nó.

Trong hướng dẫn này, chúng ta sẽ xem xét hành vi mặc định của toString () và tìm hiểu cách thay đổi hành vi của nó.

2. Hành vi mặc định

Bất cứ khi nào chúng ta in một tham chiếu đối tượng, nó sẽ gọi phương thức toString () bên trong. Vì vậy, nếu chúng ta không định nghĩa một phương thức toString () trong lớp của mình, thì Object # toString () sẽ được gọi.

Phương thức toString () của đối tượng khá chung chung:

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

Để xem cách này hoạt động như thế nào, hãy tạo một đối tượng Khách hàng mà chúng ta sẽ sử dụng trong suốt hướng dẫn của mình:

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

Bây giờ, nếu chúng ta cố gắng in đối tượng C ustomer của mình , Object # toString () sẽ được gọi và đầu ra sẽ tương tự như:

[email protected]

3. Ghi đè hành vi mặc định

Nhìn vào kết quả ở trên, chúng ta có thể thấy rằng nó không cung cấp cho chúng ta nhiều thông tin về nội dung của đối tượng Khách hàng của chúng ta . Nói chung, chúng tôi không quan tâm đến việc biết mã băm của một đối tượng, mà là nội dung của các thuộc tính đối tượng của chúng tôi.

Bằng cách ghi đè hành vi mặc định của phương thức toString () , chúng ta có thể làm cho đầu ra của lời gọi phương thức có ý nghĩa hơn.

Bây giờ, chúng ta hãy xem xét một vài trường hợp khác nhau sử dụng các đối tượng để xem cách chúng ta có thể ghi đè hành vi mặc định này.

4. Các loại và chuỗi nguyên thủy

Đối tượng Khách hàng của chúng tôi có cả thuộc tính Chuỗi và thuộc tính nguyên thủy. Chúng ta cần ghi đè phương thức toString () để đạt được đầu ra có ý nghĩa hơn:

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

Hãy xem những gì chúng ta nhận được khi gọi toString () bây giờ:

@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. Đối tượng Java phức tạp

Bây giờ chúng ta hãy xem xét một tình huống trong đó đối tượng Khách hàng của chúng ta cũng chứa một thuộc tính đặt hàng thuộc loại Đơn hàng. Lớp Order của chúng ta có cả trường kiểu dữ liệu String và nguyên thủy.

Vì vậy, hãy ghi đè lại 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() + "]"; } }

đơn đặt hàng là một đối tượng phức tạp , nếu chúng ta chỉ in đối tượng Khách hàng của mình , mà không ghi đè phương thức toString () trong lớp Đơn hàng của chúng tôi , nó sẽ in đơn đặt hàng dưới dạng [email được bảo vệ].

Để khắc phục điều đó, hãy ghi đè toString () trong 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 + "]"; } } 

Bây giờ, hãy xem điều gì sẽ xảy ra khi chúng ta gọi phương thức toString () trên đối tượng Khách hàng có chứa thuộc tính 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. Mảng đối tượng

Tiếp theo, chúng ta hãy thay đổi của chúng tôi khách hàng có một loạt các thứ tự s . Nếu chúng tôi chỉ in đối tượng Khách hàng của mình mà không cần xử lý đặc biệt đối với đối tượng đơn đặt hàng của chúng tôi , đối tượng đó sẽ in đơn hàng dưới dạng Đơn hàng; @ .

Để khắc phục điều đó, hãy sử dụng Arrays.toString () cho trường đơn hàng :

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

Hãy xem kết quả của việc gọi phương thức toString () ở trên :

@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. Wrappers, Collections và StringBuffers

Khi một đối tượng được tạo thành hoàn toàn từ các trình bao bọc, bộ sưu tập hoặc bộ đệm StringBuffer , không cần triển khai toString () tùy chỉnh vì các đối tượng này đã ghi đè phương thức toString () bằng các đại diện có ý nghĩa:

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

Chúng ta hãy xem lại kết quả của việc gọi 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. Kết luận

Trong bài viết này, chúng ta đã xem xét việc tạo triển khai phương thức toString () của riêng mình .

Tất cả mã nguồn của bài viết này đều có sẵn trên GitHub.