สามารถ==
ใช้กับenum
?
ใช่: enums มีการควบคุมอินสแตนซ์ที่ จำกัด ที่ช่วยให้คุณใช้==
เพื่อเปรียบเทียบอินสแตนซ์ นี่คือการรับประกันโดยข้อกำหนดภาษา (เน้นโดยฉัน):
ประเภท enum ไม่มีอินสแตนซ์อื่นนอกเหนือจากที่กำหนดโดยค่าคงที่ enum
มันเป็นข้อผิดพลาดในการคอมไพล์เวลาพยายามที่จะยกตัวอย่างอย่างชัดเจนประเภท enum final clone
วิธีในการEnum
ทำให้มั่นใจว่าenum
คงไม่สามารถโคลนและการดูแลเป็นพิเศษโดยมั่นใจกลไกอนุกรมว่ากรณีที่ซ้ำกันจะไม่เคยสร้างเป็นผลมาจาก deserialization ห้ามมิให้มีการสะท้อนกลับของชนิด enum ร่วมกันสิ่งทั้งสี่นี้ช่วยให้แน่ใจว่าไม่มีอินสแตนซ์ของenum
ประเภทที่เกินกว่าที่กำหนดโดยenum
ค่าคงที่
เนื่องจากมีเพียงหนึ่งตัวอย่างของแต่ละenum
คงได้รับอนุญาตให้ใช้==
ประกอบการในสถานที่ของequals
วิธีการเมื่อเปรียบเทียบสองอ้างอิงวัตถุถ้ามันเป็นที่รู้จักกันว่าอย่างน้อยหนึ่งของพวกเขาหมายถึงenum
อย่างต่อเนื่อง ( equals
วิธีการในEnum
เป็นfinal
วิธีการที่เรียกใช้super.equals
การโต้แย้งและส่งคืนผลลัพธ์เท่านั้นจึงทำการเปรียบเทียบตัวตน)
การรับประกันนี้มีความแข็งแกร่งเพียงพอที่ Josh Bloch แนะนำว่าหากคุณยืนยันในการใช้รูปแบบซิงเกิลวิธีที่ดีที่สุดในการติดตั้งคือการใช้องค์ประกอบเดียวenum
(ดู: มีผลบังคับใช้ Java 2nd Edition รายการ 3: บังคับใช้คุณสมบัติ Singleton ด้วย คอนสตรัคส่วนตัวหรือประเภท enum ; และยังปลอดภัยเรื่องเธรดในซิงเกิล )
อะไรคือความแตกต่างระหว่าง==
และequals
?
เพื่อเป็นการเตือนความจำต้องมีการกล่าวโดยทั่วไปว่า==
ไม่ใช่ทางเลือกที่เป็นไปequals
ได้ อย่างไรก็ตามเมื่อเป็นเช่นenum
นั้นมีความแตกต่างที่สำคัญสองประการที่ควรพิจารณา:
==
ไม่เคยโยน NullPointerException
enum Color { BLACK, WHITE };
Color nothing = null;
if (nothing == Color.BLACK); // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerException
==
อาจมีการตรวจสอบความเข้ากันได้ของประเภทในเวลารวบรวม
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!
ควร==
ใช้เมื่อมีผล?
โบลชกล่าวโดยเฉพาะว่าคลาสที่ไม่เปลี่ยนรูปซึ่งมีการควบคุมอินสแตนซ์ที่เหมาะสมสามารถรับประกันกับลูกค้าที่==
ใช้งานได้ enum
มีการกล่าวถึงโดยเฉพาะเพื่อเป็นตัวอย่าง
รายการที่ 1: พิจารณาวิธีการโรงงานแบบคงที่แทนการก่อสร้าง
[ ... ] มันจะช่วยให้ระดับไม่เปลี่ยนรูปเพื่อให้การรับประกันว่าไม่มีสองกรณีเท่ากับอยู่: ถ้าหากa.equals(b)
a==b
หากคลาสทำการรับประกันนี้ลูกค้าจะสามารถใช้==
โอเปอเรเตอร์แทนequals(Object)
วิธีการซึ่งอาจส่งผลให้ประสิทธิภาพดีขึ้น ประเภท Enum ให้การรับประกันนี้
เพื่อสรุปข้อโต้แย้งสำหรับการใช้==
บนenum
คือ:
- มันได้ผล.
- มันเร็วกว่า
- ปลอดภัยในเวลาทำงาน
- การรวบรวมเวลาปลอดภัยยิ่งขึ้น