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 clonemetode dalam Enummemastikan bahwa enumkonstanta 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 enumjenis ada di luar yang ditentukan olehenum konstanta.
Karena hanya ada satu instance dari setiap enumkonstanta, diperbolehkan untuk menggunakan ==operator sebagai pengganti equalsmetode ketika membandingkan dua referensi objek jika diketahui bahwa setidaknya satu dari mereka mengacu pada enumkonstanta . ( equalsMetode dalam Enumadalah finalmetode yang hanya meminta super.equalsargumennya 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. enumsecara 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 enumadalah:
- Berhasil.
- Lebih cepat.
- Lebih aman saat dijalankan.
- Lebih aman saat kompilasi.