Saya memiliki kelas yang didefinisikan sebagai berikut:
public class Person {
private String name;
// constructor and getter/setter omitted
}
Saya mencoba mencetak instance kelas saya:
System.out.println(myPerson);
tapi aku punya output sebagai berikut: com.foo.Person@2f92e0f4
.
Hal serupa terjadi ketika saya mencoba mencetak array Person
objek:
Person[] people = //...
System.out.println(people);
Saya mendapat hasilnya: [Lcom.foo.Person;@28a418fc
Apa artinya output ini? Bagaimana cara mengubah output ini sehingga berisi nama orang saya? Dan bagaimana cara mencetak koleksi benda saya?
Catatan : ini dimaksudkan sebagai tanya jawab kanonik tentang subjek ini.
Jawaban:
Latar Belakang
Semua objek Java memiliki
toString()
metode, yang dipanggil ketika Anda mencoba dan mencetak objek.Metode ini didefinisikan dalam
Object
kelas (superclass dari semua objek Java). TheObject.toString()
method mengembalikan string mencari cukup jelek, terdiri dari nama kelas, sebuah@
simbol dan kode hash dari objek dalam heksadesimal. Kode untuk ini terlihat seperti:Karena itu hasil seperti
com.foo.MyType@2f92e0f4
itu dapat dijelaskan sebagai:com.foo.MyType
- nama kelas, yaitu kelas yang adaMyType
dalam paketcom.foo
.@
- Menggabungkan string bersama2f92e0f4
kode hash objek.Nama kelas array terlihat sedikit berbeda, yang dijelaskan dengan baik di Javadocs untuk
Class.getName()
. Misalnya,[Ljava.lang.String
berarti:[
- array satu dimensi (sebagai lawan[[
atau[[[
dll.)L
- array berisi kelas atau antarmukajava.lang.String
- jenis objek dalam arrayMenyesuaikan Output
Untuk mencetak sesuatu yang berbeda ketika Anda menelepon
System.out.println(myObject)
, Anda harus menimpa paratoString()
metode di kelas Anda sendiri. Berikut ini contoh sederhana:Sekarang jika kita mencetak a
Person
, kita melihat namanya daripadacom.foo.Person@12345678
.Ingatlah bahwa
toString()
itu hanyalah salah satu cara bagi suatu objek untuk dikonversi menjadi string. Biasanya keluaran ini harus sepenuhnya menggambarkan objek Anda dengan cara yang jelas dan ringkas. Yang lebih baiktoString()
untukPerson
kelas kita mungkin:Yang akan mencetak, misalnya
Person[name=Henry]
,. Itu adalah bagian data yang sangat berguna untuk debugging / pengujian.Jika Anda ingin fokus hanya pada satu aspek objek Anda atau memasukkan banyak format jazzy, Anda mungkin lebih baik untuk mendefinisikan metode terpisah, misalnya
String toElegantReport() {...}
.Menghasilkan Output secara otomatis
Banyak IDE menawarkan dukungan untuk
toString()
metode pembuatan-otomatis , berdasarkan bidang di kelas. Lihat dokumen untuk Eclipse dan IntelliJ , misalnya.Beberapa perpustakaan Java populer juga menawarkan fitur ini. Beberapa contoh termasuk:
ToStringBuilder
dari Apache Commons LangMoreObjects.ToStringHelper
dari Google Guava@ToString
anotasi dari Proyek LombokMencetak kelompok objek
Jadi, Anda telah membuat yang bagus
toString()
untuk kelas Anda. Apa yang terjadi jika kelas itu ditempatkan ke dalam array atau koleksi?Array
Jika Anda memiliki array objek, Anda bisa menelepon
Arrays.toString()
untuk menghasilkan representasi sederhana dari isi array. Misalnya, pertimbangkan berbagaiPerson
objek ini:Catatan: ini adalah panggilan ke metode statis yang disebut
toString()
dalam kelas Array, yang berbeda dengan apa yang telah kita bahas di atas.Jika Anda memiliki array multi dimensi , Anda dapat menggunakan
Arrays.deepToString()
untuk mencapai jenis output yang sama.Koleksi
Sebagian besar koleksi akan menghasilkan output yang cantik berdasarkan panggilan
.toString()
pada setiap elemen.Jadi, Anda hanya perlu memastikan elemen daftar Anda mendefinisikan yang bagus
toString()
seperti yang dibahas di atas.sumber
return String.format( getClass().getSimpleName() + "[ name=%s ]", name);
dan benar-benar alih-alihname
harus menggunakan gettergetName()
(tetapi getter dihilangkan di kelas Person ...) tetapi jika getter digunakan ...return String.format( getClass().getSimpleName() + "[ name=%s ]", getName());
Arrays.toString()
sehingga Anda dapat menggunakannya untuk array primitif juga (int[]
,double[]
). JugaArrays.deepToString()
menangani array multidimensi primitif dengan baik.Saya pikir apache menyediakan kelas util yang lebih baik yang menyediakan fungsi untuk mendapatkan string
sumber
Setiap kelas di Jawa memiliki
toString()
metode di dalamnya secara default, yang dipanggil jika Anda melewatkan beberapa objek dari kelas itu keSystem.out.println()
. Secara default, panggilan ini mengembalikan kode nama className @ hash.Anda bisa mengganti metode toString suatu kelas untuk mendapatkan hasil yang berbeda. Lihat contoh ini
sumber
[Lcom.foo.Person;@28a418fc
sebagai output: itu adalah output daritoString()
metode juga, tetapi dari salah satu yang diimplementasikan di kelas yang dihasilkan saat runtime untuk jenisnyaPerson[]
, bukanPerson
(lihat stackoverflow.com/a/8546532/1542343 ).Di Eclipse, Pergi ke kelas Anda, Klik kanan-> sumber-> Hasilkan
toString()
;Ini akan menimpa
toString()
metode dan akan mencetak objek dari kelas itu.sumber
Saya lebih suka menggunakan fungsi utilitas yang menggunakan GSON untuk menghapus serialisasi objek Java menjadi string JSON.
sumber
return Gson.toJson(object);
, jika tidak bekerja dengan sempurna.Di intellij Anda dapat membuat metode toString secara otomatis dengan menekan alt + inset dan kemudian memilih toString () di sini adalah put out untuk kelas tes:
Seperti yang Anda lihat, ia menghasilkan sebuah String dengan menggabungkan, beberapa atribut kelas, untuk primitif akan mencetak nilai-nilai mereka dan untuk tipe referensi itu akan menggunakan tipe kelas mereka (dalam hal ini untuk metode string dari Test2).
sumber
Secara default, setiap Objek di Jawa memiliki
toString()
metode yang menampilkan ObjectType @ HashCode.Jika Anda ingin informasi yang lebih bermakna maka Anda perlu mengganti
toString()
metode di kelas Anda.Sekarang ketika Anda mencetak objek orang menggunakan
System.out.prtinln(personObj);
akan mencetak nama orang tersebut alih-alih nama kelas dan kode hash.Dalam kasus kedua Anda ketika Anda mencoba untuk mencetak array, ia mencetak
[Lcom.foo.Person;@28a418fc
jenis Array dan itu kode hash.Jika Anda ingin mencetak nama orang, ada banyak cara.
Anda dapat menulis fungsi Anda sendiri yang mengulang setiap orang dan mencetak
Anda dapat mencetaknya menggunakan Arrays.toString (). Ini tampaknya yang paling sederhana bagi saya.
Anda bisa mencetaknya dengan cara java 8 (menggunakan stream dan referensi metode).
Mungkin ada cara lain juga. Semoga ini membantu. :)
sumber
Jika Anda langsung mencetak objek Person, Ini akan menjadi
ClassName@HashCode
ke Kode.dalam kasus Anda
com.foo.Person@2f92e0f4
semakin dicetak. Di manaPerson
kelas di mana objek milik dan2f92e0f4
kode hash Obyek.Sekarang jika Anda mencoba Menggunakan objek
Person
maka akan mencetak namasumber
Jika Anda melihat kelas Object (kelas Induk semua kelas di Jawa) implementasi metode toString () adalah
setiap kali Anda mencetak objek apa pun di Jawa, maka toString () akan dipanggil. Sekarang terserah Anda jika Anda mengganti toString () maka metode Anda akan memanggil panggilan metode kelas objek lainnya.
sumber