Saya ingin mencetak "referensi objek" dari suatu objek di Java untuk keperluan debugging. Yaitu untuk memastikan bahwa objeknya sama (atau berbeda) tergantung situasinya.
Masalahnya adalah bahwa kelas tersebut mewarisi dari kelas lain, yang telah menimpa toString () dan hashCode () yang biasanya akan memberi saya id.
Contoh situasi: Menjalankan aplikasi multi-utas, di mana saya (selama pengembangan) ingin memeriksa apakah semua utas menggunakan contoh yang sama dari objek sumber daya atau tidak.
Jawaban:
Apa sebenarnya yang Anda rencanakan untuk dilakukan dengannya (apa yang ingin Anda lakukan membuat perbedaan dengan apa yang perlu Anda panggil).
hashCode
, seperti yang didefinisikan dalam JavaDocs, mengatakan:Jadi, jika Anda menggunakan
hashCode()
untuk mencari tahu apakah itu adalah objek unik dalam memori, itu bukan cara yang baik untuk melakukannya.System.identityHashCode
melakukan hal berikut:Yang, untuk apa yang Anda lakukan, terdengar seperti yang Anda inginkan ... tetapi apa yang ingin Anda lakukan mungkin tidak aman tergantung pada bagaimana pustaka diimplementasikan.
sumber
Beginilah cara saya menyelesaikannya:
sumber
Ganda sama dengan
==
akan selalu memeriksa berdasarkan identitas objek, terlepas dari implementasi objek dari kode hash atau sama. Tentu saja - pastikan referensi objek yang Anda bandingkanvolatile
(dalam JVM 1,5+).Jika Anda benar-benar harus memiliki hasil toString Object asli (meskipun itu bukan solusi terbaik untuk contoh kasus penggunaan Anda), perpustakaan Commons Lang memiliki metode ObjectUtils.identityToString (Object) yang akan melakukan apa yang Anda inginkan. Dari JavaDoc:
sumber
Anda tidak dapat melakukan apa yang Anda inginkan dengan aman karena hashCode () default mungkin tidak mengembalikan alamat tersebut, dan telah disebutkan, beberapa objek dengan kode hash yang sama dimungkinkan. Satu-satunya cara untuk mencapai apa yang Anda inginkan adalah dengan benar-benar mengganti metode hashCode () untuk objek yang dimaksud dan menjamin bahwa semuanya memberikan nilai yang unik. Apakah ini layak dalam situasi Anda adalah pertanyaan lain.
Sebagai catatan, saya telah mengalami beberapa objek dengan kode hash default yang sama di VM IBM yang berjalan di server WAS. Kami memiliki cacat di mana objek yang dimasukkan ke cache jarak jauh akan ditimpa karena ini. Itu adalah pembuka mata bagi saya pada saat itu karena saya menganggap kode hash default adalah alamat memori objek juga.
sumber
Tambahkan id unik ke semua instance Anda, yaitu
Perluas dari AbstractSomething dan kueri properti ini. Akan aman di dalam satu vm (dengan asumsi tidak ada permainan yang dimainkan dengan classloader untuk menghindari statika).
sumber
sun.misc.Unsafe
kita cukup menyalin kode dari tostring kelas objek untuk mendapatkan referensi string
sumber