Kaedah Java toString ()

1. Gambaran keseluruhan

Setiap kelas di Jawa adalah anak kelas Objek sama ada secara langsung atau tidak langsung. Dan kerana kelas Objek mengandungi kaedah toString () , kita dapat memanggil toString () pada setiap keadaan dan mendapatkan representasi rentetan.

Dalam tutorial ini, kita akan melihat tingkah laku default toString () dan belajar bagaimana mengubah tingkah lakunya.

2. Kelakuan Lalai

Setiap kali kita mencetak rujukan objek, ia menggunakan kaedah toString () secara dalaman. Jadi, jika kita tidak menentukan kaedah toString () di kelas kita, maka Object # toString () dipanggil.

Kaedah Objek toString () cukup generik:

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

Untuk melihat bagaimana ini berfungsi, mari buat objek Pelanggan yang akan kami gunakan sepanjang tutorial kami:

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

Sekarang, jika kita mencetak objek ustomer C kita , Object # toString () akan dipanggil, dan outputnya akan serupa dengan:

[email protected]

3. Mengelak Kelakuan Lalai

Melihat output di atas, kita dapat melihat bahawa tidak memberi kita banyak maklumat mengenai kandungan objek Pelanggan kita . Umumnya, kami tidak berminat untuk mengetahui hashcode objek, melainkan isi atribut objek kami.

Dengan mengatasi tingkah laku lalai kaedah toString () , kita dapat menjadikan output dari kaedah memanggil lebih bermakna.

Sekarang, mari kita lihat beberapa senario yang berbeza menggunakan objek untuk melihat bagaimana kita dapat mengatasi tingkah laku lalai ini.

4. Jenis dan Rentetan Primitif

Objek Pelanggan kami mempunyai atribut String dan primitif. Kita perlu mengganti kaedah toString () untuk mencapai output yang lebih bermakna:

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

Mari lihat apa yang kita dapat apabila kita memanggil ke String () sekarang:

@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. Objek Java Kompleks

Sekarang mari kita pertimbangkan senario di mana objek Pelanggan kami juga mengandungi atribut pesanan yang jenis Pesanan. Kelas Pesanan kami mempunyai medan jenis data String dan primitif.

Oleh itu, mari kita ganti ke String () sekali lagi:

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

Oleh kerana pesanan adalah objek yang kompleks , jika kita hanya mencetak objek Pelanggan kita , tanpa mengesampingkan kaedah toString () di kelas Pesanan kita , pesanan akan mencetak pesanan sebagai [dilindungi e-mel].

Untuk memperbaikinya mari kita ganti ke String () dalam Urutan juga:

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

Sekarang, mari kita lihat apa yang berlaku apabila kita memanggil kaedah toString () pada objek Pelanggan kami yang mengandungi atribut pesanan :

@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 Objek

Seterusnya, mari kita menukar kami Pelanggan mempunyai pelbagai Order s . Sekiranya kami hanya mencetak objek Pelanggan kami , tanpa pengendalian khusus untuk objek pesanan kami , ia akan mencetak pesanan sebagai Pesanan; @ .

Untuk memperbaikinya mari gunakan Arrays.toString () untuk bidang pesanan :

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

Mari lihat hasil memanggil kaedah toString () di atas :

@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. Pembungkus, Koleksi, dan StringBuffers

Apabila objek terdiri sepenuhnya dari pembungkus, koleksi, atau StringBuffer s, tidak perlu implementasi custom toString () kerana objek ini telah mengesampingkan kaedah toString () dengan representasi yang bermakna:

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

Mari kita lihat lagi hasil panggilan keString () :

@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. Kesimpulannya

Dalam artikel ini, kami melihat membuat implementasi sendiri kaedah toString () .

Semua kod sumber untuk artikel ini terdapat di GitHub.