เหตุใดการเปรียบเทียบ enum โดยใช้ == ทำให้เกิดคำเตือน PMD

ข้อมูลต่อไปนี้จะเปรียบเทียบค่าแจงนับสองค่าโดยใช้ ==:

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

แต่ PMD ให้คำเตือน CompareObjectsWithEquals ในบรรทัดที่ 3:

ใช้เท่ากับ() เพื่อเปรียบเทียบการอ้างอิงวัตถุ

ไม่แน่ใจว่าฉันเข้าใจ ซอร์สโค้ด สำหรับการตรวจสอบนี้แต่คิดว่าสามารถเปรียบเทียบสอง enum โดยใช้ == ดังนั้นฉันจึงสงสัยว่ารหัสของฉันควรปรับปรุงหรือไม่หรือการตรวจสอบไม่ถูกต้อง


person Steve Chambers    schedule 18.06.2015    source แหล่งที่มา
comment
มันโอเค. อาจเกี่ยวข้อง: sourceforge.net/p/pmd/bugs/1028   -  person MadConan    schedule 18.06.2015
comment
ดูเพิ่มเติมที่ การเปรียบเทียบสมาชิก Java enum: == หรือเท่ากับ()?   -  person Raedwald    schedule 13.09.2019


คำตอบ (2)


นี่ถือเป็นข้อผิดพลาดอย่างแน่นอน:

อย่างไรก็ตาม ดูเหมือนว่าจะเป็นเรื่องยากที่จะตรวจจับทุกกรณีที่เป็นไปได้ (อ้างอิงจากข้อผิดพลาดที่ใหม่กว่า):

อันนั้นค่อนข้างยุ่งยากเล็กน้อย ในการที่จะตัดสินได้ว่าประเภทนั้นเป็น Enum หรือไม่ เราจำเป็นต้องมีการแก้ไขประเภท

ฉันสามารถปรับกฎเพื่อตรวจสอบว่าประเภทของตัวแปรเป็น Enum หรือไม่ ใช้งานได้เฉพาะถ้าประเภท Enum อยู่บน "auxclasspath" ของ pmd เพื่อให้ความละเอียดของประเภทสามารถค้นหาได้

ตัวอย่างของคุณที่แยกออกมาจะยังคงกระตุ้นให้เกิดผลบวกลวงนี้ เนื่องจาก PMD ไม่ทราบว่า ProcessingStatus คืออะไร ฉันตรวจสอบด้วย java.math.RoundingMode ซึ่งอยู่บน classpath เสมอและจะได้รับการแก้ไข

("ตัวอย่างของคุณ" หมายถึงผู้เขียนตั๋ว ไม่ใช่ OP บน Stack Overflow)

กรณีของคุณ อาจ ใช้ได้กับ PMD 5 ซึ่งแหล่งที่มาที่คุณลิงก์เป็นของ PMD 4

อัปเดต: แหล่งที่มาปัจจุบัน มีการตรวจสอบเพิ่มเติมสำหรับการแจงนับ:

 // 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

คุณสามารถใช้ .equals() ได้ เพราะ เบื้องหลัง สิ่งที่เกิดขึ้นคือมีการเปรียบเทียบอินสแตนซ์กับ ==

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

โปรดทราบว่าการใช้งาน .equals() นี้คือ final ซึ่งหมายความว่าคุณไม่สามารถแทนที่ค่าดังกล่าวในแจงนับของคุณได้

person Konstantin Yovkov    schedule 18.06.2015
comment
ขอบคุณ - แต่ enum ตัวใดตัวหนึ่งอาจเป็นค่าว่างได้ ดังนั้นคุณไม่ต้องการเสี่ยงกับ NullPointerException - person Steve Chambers; 18.06.2015
comment
จากนั้นคุณจะต้องเพิ่มเช็ค หรือใช้ประเภท Optional<T> ของ Java8 :) - person Konstantin Yovkov; 18.06.2015
comment
หรือปฏิบัติตาม enum1 == enum2 และเพิกเฉยต่อคำเตือน PMD นี้ - person stuXnet; 18.06.2015