Mengapa membandingkan enum menggunakan == menyebabkan peringatan PMD?

Berikut ini membandingkan dua nilai enum menggunakan ==:

MyEnum enum1 = blah();     // could return null
MyEnum enum2 = blahblah()  // could return null
if (enum1 == enum2) {
    // ...
}

Namun PMD memberikan peringatan CompareObjectsWithEquals pada baris 3:

Gunakan sama dengan() untuk membandingkan referensi objek

Tidak yakin saya memahami kode sumber untuk pemeriksaan ini tetapi menurut saya tidak masalah membandingkan dua enum menggunakan == jadi saya bertanya-tanya apakah kode saya dapat diperbaiki atau pemeriksaannya salah.


person Steve Chambers    schedule 18.06.2015    source sumber
comment
Tidak apa-apa. Mungkin relevan: sourceforge.net/p/pmd/bugs/1028   -  person MadConan    schedule 18.06.2015
comment
Lihat juga Membandingkan anggota enum Java: == atau sama dengan()?.   -  person Raedwald    schedule 13.09.2019


Jawaban (2)


Ini memang diterima sebagai bug:

Namun, tampaknya sulit untuk menangkap semua kemungkinan kasus (kutipan dari bug yang lebih baru):

Yang ini agak rumit, karena untuk menentukan apakah suatu tipe adalah Enum, kita memerlukan resolusi tipe.

Saya dapat menyesuaikan aturan untuk memeriksa, apakah tipe variabelnya adalah Enum. Ini hanya berfungsi, jika tipe Enum berada di "auxclasspath" pmd, sehingga resolusi tipe dapat menemukannya.

Contoh Anda secara terpisah masih akan memicu positif palsu ini, karena PMD tidak mengetahui apa itu ProcessingStatus. Saya memverifikasinya dengan java.math.RoundingMode, yang selalu ada di classpath dan akan diselesaikan.

("Contoh Anda" mengacu pada pembuat tiket, bukan OP di Stack Overflow)

Kasing Anda mungkin dapat digunakan dengan PMD 5, sumber yang Anda tautkan adalah milik PMD 4.

Pembaruan: sumber saat ini berisi pemeriksaan tambahan untuk enum:

 // skip, if it is an enum
 if (type0.getType() != null && type0.getType().equals(type1.getType()) && type0.getType().isEnum()) {
      return data;
 }
person Marvin    schedule 18.06.2015

Tidak masalah menggunakan .equals(), karena di balik terpal, yang terjadi adalah instance tersebut dibandingkan dengan ==.

public final boolean equals(Object other) {
    return this==other;
}

Perhatikan bahwa implementasi .equals() ini adalah final, yang berarti Anda tidak dapat menimpanya di enum Anda.

person Konstantin Yovkov    schedule 18.06.2015
comment
Terima kasih - tetapi salah satu enumnya bisa saja nol jadi tidak ingin mengambil risiko NullPointerException. - person Steve Chambers; 18.06.2015
comment
Maka Anda harus menambahkan tanda centang. Atau gunakan tipe Optional<T> Java8. :) - person Konstantin Yovkov; 18.06.2015
comment
Atau tetap berpegang pada enum1 == enum2 dan abaikan peringatan PMD ini. - person stuXnet; 18.06.2015