Metode Java toString ()

1. Ikhtisar

Setiap kelas di Java adalah anak dari kelas Object baik secara langsung maupun tidak langsung. Dan karena kelas Object berisi metode toString () , kita bisa memanggil toString () pada setiap instance dan mendapatkan representasi stringnya.

Dalam tutorial ini, kita akan melihat perilaku default toString () dan mempelajari cara mengubah perilakunya.

2. Perilaku Default

Setiap kali kita mencetak referensi objek, itu memanggil metode toString () secara internal. Jadi, jika kita tidak mendefinisikan metode toString () di kelas kita, maka Object # toString () akan dipanggil.

Objek toString () metode cukup generik:

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

Untuk melihat bagaimana ini bekerja, mari buat objek Pelanggan yang akan kita gunakan sepanjang tutorial kita:

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

Sekarang, jika kita mencoba untuk mencetak objek C ustomer kita , Object # toString () akan dipanggil, dan hasilnya akan sama dengan:

[email protected]

3. Mengesampingkan Perilaku Default

Melihat output di atas, kita dapat melihat bahwa itu tidak memberi kita banyak informasi tentang konten objek Pelanggan kita . Secara umum, kami tidak tertarik untuk mengetahui kode hash suatu objek, melainkan konten atribut objek kami.

Dengan menimpa perilaku default metode toString () , kita bisa membuat keluaran dari panggilan metode lebih bermakna.

Sekarang, mari kita lihat beberapa skenario berbeda menggunakan objek untuk melihat bagaimana kita dapat menimpa perilaku default ini.

4. Jenis dan String Primitif

Objek Pelanggan kami memiliki atribut String dan primitif. Kita perlu mengganti metode toString () untuk mencapai keluaran yang lebih bermakna:

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

Mari kita lihat apa yang kita dapatkan saat memanggil toString () 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 yang Kompleks

Sekarang mari kita pertimbangkan skenario di mana objek Pelanggan kita juga berisi atribut order yang bertipe Order. Kelas Order kami memiliki bidang tipe data String dan primitif.

Jadi, mari kita timpa toString () 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() + "]"; } }

Karena order adalah objek yang kompleks , jika kita hanya mencetak objek Customer kita , tanpa menimpa metode toString () di kelas Order kita , ia akan mencetak pesanan sebagai [email protected].

Untuk memperbaikinya mari kita timpa toString () di Order , 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 terjadi ketika kita memanggil metode toString () pada objek Customer kita yang berisi atribut 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. Array Objek

Berikutnya, mari kita mengubah kami Pelanggan untuk memiliki sebuah array dari Orde s . Jika kita hanya mencetak objek Customer kita , tanpa penanganan khusus untuk objek pesanan kita , maka akan mencetak order sebagai Order; @ .

Untuk mengatasinya, 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 kita lihat hasil pemanggilan metode 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. Wrappers, Collections, dan StringBuffers

Ketika sebuah objek seluruhnya terdiri dari pembungkus, koleksi, atau StringBuffer , tidak ada implementasi toString () khusus yang diperlukan karena objek ini telah mengganti metode toString () dengan representasi yang berarti:

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 kembali hasil pemanggilan 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. Kesimpulan

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

Semua kode sumber untuk artikel ini tersedia di GitHub.