Apakah boleh digunakan ==
pada enum di Java, atau apakah saya perlu menggunakannya .equals()
? Dalam pengujian saya, ==
selalu berhasil, tetapi saya tidak yakin apakah saya dijamin akan hal itu. Secara khusus, tidak ada .clone()
metode pada enum, jadi saya tidak tahu apakah mungkin mendapatkan enum yang .equals()
akan mengembalikan nilai berbeda dari ==
.
Misalnya, apakah ini OK:
public int round(RoundingMode roundingMode) {
if(roundingMode == RoundingMode.HALF_UP) {
//do something
} else if (roundingMode == RoundingMode.HALF_EVEN) {
//do something
}
//etc
}
Atau apakah saya perlu menulis seperti ini:
public int round(RoundingMode roundingMode) {
if(roundingMode.equals(RoundingMode.HALF_UP)) {
//do something
} else if (roundingMode.equals(RoundingMode.HALF_EVEN)) {
//do something
}
//etc
}
Jawaban:
Hanya 2 sen saya: Ini adalah kode untuk Enum.java, seperti yang diterbitkan oleh Sun, dan bagian dari JDK:
sumber
Ya, == tidak masalah - dijamin hanya ada satu referensi untuk setiap nilai.
Namun, ada cara yang lebih baik untuk menulis metode bulat Anda:
Cara yang lebih baik untuk melakukannya adalah dengan meletakkan fungsionalitas di dalam enum itu sendiri, jadi Anda bisa memanggil
roundingMode.round(someValue)
. Ini sampai ke inti enum Java - mereka enum berorientasi objek , tidak seperti "nilai bernama" yang ditemukan di tempat lain.EDIT: Spesifikasi tidak terlalu jelas, tetapi bagian 8.9 menyatakan:
sumber
Ya, ini seolah-olah Anda telah membuat instance tunggal untuk setiap nilai dalam enum:
Namun ,
enum
konstruksinya memberi Anda berbagai manfaat:switch-case
struktur kontrol.values
yang 'dihasilkan' untuk setiap jenis enumerasiSerialisasi adalah masalah besar. Jika saya menggunakan kode di atas dan bukan enum, berikut ini bagaimana persamaan identitas akan berperilaku:
Anda dapat mengatasi masalah ini tanpa enum, menggunakan teknik yang melibatkan
writeReplace
danreadResolve
, (lihat http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html ) ...Saya kira intinya adalah - Java berusaha keras untuk memungkinkan Anda menggunakan identitas enum values untuk menguji kesetaraan; itu adalah praktik yang didorong.
sumber
== membandingkan referensi dari dua objek. Untuk enum, dijamin hanya akan ada satu instance, dan oleh karena itu untuk dua enum yang sama, == akan menjadi true.
Referensi:
http://www.ajaxonomy.com/2007/java/making-the-most-of-java-50-enum-tricks
(tidak dapat menemukan apa pun di Sun docs)
sumber
Berikut adalah beberapa kode jahat yang mungkin menarik bagi Anda. : D
sumber
Unsafe.class
.Enum adalah tempat yang tepat untuk memasukkan kode polimorfik.
sumber
Perhatikan bahwa ada masalah saat mentransfer enum melalui RMI / IIOP. Lihat utas ini:
http://www.velocityreviews.com/forums/t390342-enum-equality.html
sumber
== umumnya tidak masalah, dan ada keuntungan untuk == dan
.equals()
. Saya pribadi lebih suka untuk selalu menggunakan.equals()
saat membandingkan Objek, termasukenum
s. Lihat juga pembahasan ini:Membandingkan anggota enum Java: == atau sama dengan ()?
sumber