Apakah ==
bisa digunakan enum
?
Ya: enum memiliki kontrol instans ketat yang memungkinkan Anda gunakan ==
untuk membandingkan instance. Inilah jaminan yang diberikan oleh spesifikasi bahasa (penekanan oleh saya):
Tipe enum tidak memiliki instance selain yang didefinisikan oleh konstanta enumnya.
Ini adalah kesalahan waktu kompilasi untuk mencoba secara eksplisit instantiate tipe enum. The final clone
metode dalam Enum
memastikan bahwa enum
konstanta tidak pernah bisa dikloning, dan perlakuan khusus oleh memastikan mekanisme serialisasi yang duplikat contoh yang tidak pernah dibuat sebagai hasil dari deserialization. Instansiasi reflektif dari tipe enum dilarang. Bersama-sama, keempat hal ini memastikan bahwa tidak ada contoh enum
jenis ada di luar yang ditentukan olehenum
konstanta.
Karena hanya ada satu instance dari setiap enum
konstanta, diperbolehkan untuk menggunakan ==
operator sebagai pengganti equals
metode ketika membandingkan dua referensi objek jika diketahui bahwa setidaknya satu dari mereka mengacu pada enum
konstanta . ( equals
Metode dalam Enum
adalah final
metode yang hanya meminta super.equals
argumennya dan mengembalikan hasilnya, sehingga melakukan perbandingan identitas.)
Jaminan ini cukup kuat yang direkomendasikan Josh Bloch, bahwa jika Anda bersikeras menggunakan pola tunggal, cara terbaik untuk mengimplementasikannya adalah dengan menggunakan elemen tunggal enum
(lihat: Java Efektif Edisi 2, Butir 3: Terapkan properti singleton dengan konstruktor pribadi atau tipe enum ; juga keamanan Thread di Singleton )
Apa perbedaan antara ==
danequals
?
Sebagai pengingat, perlu dikatakan bahwa secara umum, ==
BUKAN merupakan alternatif untuk equals
. Ketika itu, bagaimanapun (seperti denganenum
), ada dua perbedaan penting yang perlu dipertimbangkan:
==
tidak pernah melempar NullPointerException
enum Color { BLACK, WHITE };
Color nothing = null;
if (nothing == Color.BLACK); // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerException
==
harus mengetik pemeriksaan kompatibilitas pada waktu kompilasi
enum Color { BLACK, WHITE };
enum Chiral { LEFT, RIGHT };
if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine
if (Color.BLACK == Chiral.LEFT); // DOESN'T COMPILE!!! Incompatible types!
Sebaiknya ==
digunakan saat berlaku?
Bloch secara khusus menyebutkan bahwa kelas yang tidak dapat diubah yang memiliki kontrol yang tepat atas instance mereka dapat menjamin klien mereka ==
dapat digunakan. enum
secara khusus disebutkan untuk dicontohkan.
Butir 1: Pertimbangkan metode pabrik statis daripada konstruktor
[...] ini memungkinkan kelas yang tidak dapat diubah untuk membuat jaminan bahwa tidak ada dua instance yang sama ada: a.equals(b)
jika dan hanya jika a==b
. Jika suatu kelas membuat jaminan ini, maka kliennya dapat menggunakan ==
operator alih-alih equals(Object)
metode, yang dapat menghasilkan peningkatan kinerja. Jenis Enum memberikan jaminan ini.
Untuk meringkas, argumen untuk digunakan ==
pada enum
adalah:
- Berhasil.
- Lebih cepat.
- Lebih aman saat dijalankan.
- Lebih aman saat kompilasi.