แนวคิด
ชื่อเต็มของ enum คือการแจงนับซึ่งเป็นคุณสมบัติใหม่ที่แนะนำใน JDK 1.5
ใน Java ประเภทที่แก้ไขโดยคำหลัก enum คือประเภท enum แบบฟอร์มมีดังนี้:
สี enum {สีแดง, เขียว, สีน้ำเงิน}หาก enum ไม่เพิ่มวิธีใด ๆ ค่า enum ค่าเริ่มต้นเป็นค่าที่สั่งซื้อเริ่มจาก 0 การใช้ประเภทการแจงนับสีเป็นตัวอย่างค่าคงที่การแจงนับเป็นสีแดง: 0, สีเขียว: 1 และสีน้ำเงิน: 2 ตามลำดับ
ประโยชน์ของการแจงนับ: ค่าคงที่สามารถจัดและจัดการในลักษณะที่เป็นเอกภาพ
สถานการณ์แอปพลิเคชันทั่วไปสำหรับการแจงนับ: รหัสข้อผิดพลาด, เครื่องสถานะ, ฯลฯ
ลักษณะของประเภทการแจงนับ
แม้ว่า enum จะดูเหมือนประเภทข้อมูลใหม่ แต่อันที่จริงแล้ว Enum เป็นคลาสที่ จำกัด และมีวิธีการของตัวเอง
เมื่อสร้าง enum คอมไพเลอร์จะสร้างคลาสที่เกี่ยวข้องสำหรับคุณซึ่งสืบทอดมาจาก java.lang.Enum
การประกาศคลาส java.lang.Enum
คลาสนามธรรมสาธารณะ enum <e ขยาย enum <e>> ใช้การเปรียบเทียบ <e>, serializable {... }วิธีการแจงนับ
ใน enum มีวิธีการพื้นฐานบางอย่าง:
values() : ส่งคืนอาร์เรย์ของอินสแตนซ์ enum และองค์ประกอบในอาร์เรย์นี้ได้รับการดูแลอย่างเคร่งครัดตามลำดับที่พวกเขาประกาศใน enum
name() : ส่งคืนชื่ออินสแตนซ์
ordinal() : ส่งคืนคำสั่งซื้อเมื่อมีการประกาศอินสแตนซ์เริ่มต้นจาก 0
getDeclaringClass() : ส่งคืนประเภท enum ที่เป็นของอินสแตนซ์
equals() : กำหนดว่ามันเป็นวัตถุเดียวกันหรือไม่
คุณสามารถใช้ == เพื่อเปรียบเทียบ enum ซ์ enum
นอกจากนี้ java.lang.Enum ยังใช้อินเทอร์เฟซ Comparable และ Serializable ดังนั้นจึงมีวิธีการเปรียบเทียบ ()
ตัวอย่าง: วิธีพื้นฐานในการแสดง enum
คลาสสาธารณะ enummethoddemo {enum color {สีแดง, สีเขียว, สีน้ำเงิน; ========================================================================== (สี C: Color.values () System.out.println ("=============== พิมพ์ขนาดทั้งหมด ============================================ (ขนาด s: size.values () Color.green; Color.green: " + Green.equals (color.green)); System.out.println (" สีเขียวเท่ากับขนาด. middle: " + green.equals (ขนาด middle)); system.out.println (" สีเขียวเท่ากับ 1: " + สีเขียว -เอาท์พุท
================================ ordinal สีแดง: 0Green ลำดับ: 1Blue ลำดับ: 2 ================ พิมพ์ขนาดทั้งหมด =================== GetDeclaringClass (): คลาส org.zp.javase.enumeration.enumdemo $ colorgreen hashcode (): 460141958Green color.green: 0Green เท่ากับสีกรีน
คุณสมบัติของการแจงนับ
ลักษณะของการแจงนับรวมในหนึ่งประโยค:
นอกเหนือจากการไม่สามารถสืบทอดได้แล้ว enum สามารถถือได้ว่าเป็นชั้นเรียนปกติ
แต่ประโยคนี้ต้องเข้าใจแยกต่างหากให้เราอธิบายอย่างละเอียด
การแจงนับสามารถเพิ่มวิธีการ
ในบทที่แนวคิดค่า enum ค่าเริ่มต้นเป็นค่าที่สั่งซื้อเริ่มจาก 0 จากนั้นคำถามคือ: วิธีการกำหนดค่าให้กับ enum ที่แสดง
Java ไม่อนุญาตให้ใช้ = กำหนดค่าให้กับค่าคงที่ enum
หากคุณได้สัมผัสกับ C/C ++ คุณจะนึกถึงสัญลักษณ์ที่ได้รับมอบหมาย = ตามธรรมชาติ ในภาษา c/c ++ enum สามารถกำหนดให้กับค่าคงที่ enum ด้วยสัญลักษณ์การกำหนด = แสดง; อย่างไรก็ตามน่าเสียดายที่ไม่อนุญาตให้ใช้สัญลักษณ์ที่กำหนด = ที่กำหนดให้กับค่าคงที่ enum ไม่ได้รับอนุญาตในไวยากรณ์ Java
ตัวอย่าง: การประกาศการแจงนับในภาษา C/C ++
typedef enum {one = 1, สอง, สาม = 3, สิบ = 10} หมายเลข;enum สามารถเพิ่มวิธีการธรรมดาวิธีการคงที่วิธีการนามธรรมและวิธีการสร้าง
แม้ว่า Java จะไม่สามารถกำหนดค่าโดยตรงกับอินสแตนซ์ แต่ก็มีทางออกที่ดียิ่งขึ้น: เพิ่มวิธีการในการ enum เพื่อใช้การกำหนดแสดงผลทางอ้อม
เมื่อสร้าง enum คุณสามารถเพิ่มหลายวิธีลงในนั้นและแม้แต่ตัวสร้างให้กับมัน
หมายเหตุรายละเอียดหนึ่ง: หากคุณต้องการกำหนดวิธีการสำหรับ enum คุณต้องเพิ่มเครื่องหมายอัฒภาคเมื่อสิ้นสุดอินสแตนซ์สุดท้ายของ enum นอกจากนี้ใน enum อินสแตนซ์จะต้องกำหนดก่อนและไม่สามารถกำหนดฟิลด์หรือวิธีการก่อนที่อินสแตนซ์ มิฉะนั้นคอมไพเลอร์จะรายงานข้อผิดพลาด
ตัวอย่าง: แสดงวิธีการกำหนดวิธีปกติวิธีการแบบคงที่วิธีการนามธรรมและวิธีการสร้างวิธีการในการแจกแจง
public enum errorcode {ตกลง (0) {public String getDescription () {return "สำเร็จ"; }}, error_a (100) {สตริงสาธารณะ getDescription () {return "ข้อผิดพลาด A"; }}, error_b (200) {สตริงสาธารณะ getDescription () {return "ข้อผิดพลาด b"; - รหัส INT ส่วนตัว // constructor: ตัวสร้างของ enum สามารถประกาศได้เฉพาะการอนุญาตส่วนตัวหรือไม่ประกาศสิทธิ์ส่วนตัว errorcode (หมายเลข int) {// constructor this.code = number; } public int getCode () {// วิธีการส่งคืนวิธีการสามัญ } // วิธีการทั่วไปสตริงนามธรรมสาธารณะ getDescription (); // วิธีการบทคัดย่อโมฆะสาธารณะคงที่หลัก (สตริง args []) {// วิธีการคงที่สำหรับ (errorcode s: errorcode.values ()) {system.out.println ("รหัส:" + s.getCode () + ", คำอธิบาย:" + s.getDescription (); -หมายเหตุ: ไม่แนะนำตัวอย่างข้างต้นเพียงเพื่อแสดงว่าการแจงนับสนับสนุนคำจำกัดความของวิธีการต่าง ๆ นี่คือตัวอย่างที่เรียบง่าย
ตัวอย่าง: คำจำกัดความของประเภทการแจกแจงรหัสข้อผิดพลาด
ผลลัพธ์การดำเนินการของตัวอย่างนี้และตัวอย่างข้างต้นเหมือนกันทุกประการ
public enum errorcodeen {ok (0, "ความสำเร็จ"), error_a (100, "ข้อผิดพลาด"), error_b (200, "ข้อผิดพลาด B"); ErrorCodeen (หมายเลข int, คำอธิบายสตริง) {this.code = number; this.description = คำอธิบาย; } รหัส int ส่วนตัว; คำอธิบายสตริงส่วนตัว; public int getCode () {รหัสส่งคืน; } สตริงสาธารณะ getDescription () {return คำอธิบาย; } โมฆะคงที่สาธารณะหลัก (สตริง args []) {// วิธีการคงที่สำหรับ (errorcodeen s: errorCodeen.Values ()) {system.out.println ("รหัส:" + s.getCode () + ", คำอธิบาย:" + s.getDescription ()); -การแจงนับสามารถใช้อินเทอร์เฟซ
enum สามารถใช้อินเทอร์เฟซเช่นคลาสทั่วไป
นอกจากนี้ยังใช้คลาสการแจงนับรหัสข้อผิดพลาดในส่วนก่อนหน้า โดยการใช้อินเทอร์เฟซสามารถ จำกัด วิธีการของมันได้
อินเทอร์เฟซสาธารณะ inumberenum {int getCode (); String getDescription ();} enum public errorcodeen2 ใช้ inumberenum {ตกลง (0, "ความสำเร็จ"), error_a (100, "ข้อผิดพลาด"), error_b (200, "ข้อผิดพลาด b"); ErrorCodeen2 (หมายเลข int, คำอธิบายสตริง) {this.code = number; this.description = คำอธิบาย; } รหัส int ส่วนตัว; คำอธิบายสตริงส่วนตัว; @Override สาธารณะ int getCode () {รหัสส่งคืน; } @Override สตริงสาธารณะ getDescription () {return คำอธิบาย; -การแจงนับไม่สามารถสืบทอดได้
Enum ไม่สามารถสืบทอดคลาสอื่นและแน่นอนว่ามันไม่สามารถสืบทอด enum อื่นได้
เนื่องจาก enum ได้รับการสืบทอดมาจากคลาส java.lang.Enum และ Java ไม่รองรับการสืบทอดหลายครั้ง enum จึงไม่สามารถสืบทอดคลาสอื่นและแน่นอนว่ามันไม่สามารถสืบทอด enum อื่นได้
แสดงสถานการณ์แอปพลิเคชัน
จัดระเบียบค่าคงที่
ก่อน jdk1.5 คำจำกัดความของค่าคงที่ใน Java เป็น public static final TYPE a ; ในรูปแบบนี้ ด้วยการแจกแจงคุณสามารถจัดระเบียบค่าคงที่ของการเชื่อมโยงเพื่อให้รหัสอ่านได้และปลอดภัยยิ่งขึ้นและใช้วิธีการที่จัดทำโดยการแจกแจง
รูปแบบการแจงนับ
หมายเหตุ: หากไม่มีวิธีการที่กำหนดไว้ใน enum คุณสามารถเพิ่มเครื่องหมายจุลภาค, เครื่องหมายอัมพาตหรือไม่มีอะไรหลังจากอินสแตนซ์สุดท้าย
วิธีการประกาศสามวิธีต่อไปนี้เทียบเท่า:
สี enum {สีแดง, สีเขียว, สีน้ำเงิน} สี enum {สีแดง, เขียว, สีน้ำเงิน, สีน้ำเงิน,} enum สี {สีแดง, สีเขียว, สีน้ำเงิน; -สลับเครื่องสถานะ
เรามักจะใช้คำสั่งสวิตช์เพื่อเขียนเครื่องสถานะ หลังจาก JDK7 สวิตช์ได้รองรับพารามิเตอร์ของ int、char、String、enum เมื่อเปรียบเทียบกับพารามิเตอร์ประเภทนี้สวิตช์รหัสโดยใช้การแจกแจงสามารถอ่านได้มากขึ้น
สัญญาณ enum {สีแดง, สีเหลือง, สีเขียว} สตริงคงที่สาธารณะ getTrafficInstruct (สัญญาณสัญญาณ) {สตริงแนะนำ = "สัญญาณไฟล้มเหลว"; สวิตช์ (สัญญาณ) {เคสสีแดง: แนะนำ = "แสงสีแดงหยุด"; หยุดพัก; กรณีสีเหลือง: แนะนำ = "โปรดให้ความสนใจกับแสงสีเหลือง"; หยุดพัก; Case Green: corder = "Green Light Line"; หยุดพัก; ค่าเริ่มต้น: break; } return cruster;}จัดระเบียบการแจงนับ
การแจกแจงประเภทที่คล้ายกันสามารถจัดระเบียบผ่านอินเทอร์เฟซหรือคลาส
อย่างไรก็ตามโดยทั่วไปจะถูกจัดระเบียบโดยอินเทอร์เฟซ
เหตุผลคือ: อินเทอร์เฟซ Java จะเพิ่มตัวปรับเปลี่ยน public static โดยอัตโนมัติในประเภท enum เมื่อรวบรวม; คลาส Java จะเพิ่ม modifier static โดยอัตโนมัติในประเภท enum เมื่อรวบรวม คุณเคยเห็นความแตกต่างหรือไม่? ถูกต้องนั่นคือจัดระเบียบ enum ในชั้นเรียน หากคุณไม่แก้ไขให้เป็น public คุณสามารถเข้าถึงได้ในแพ็คเกจนี้เท่านั้น
ตัวอย่าง: จัดระเบียบ enums ในอินเทอร์เฟซ
พืชอินเทอร์เฟซสาธารณะ {enum ผักใช้ inumberenum {มันฝรั่ง (0, "มันฝรั่ง"), มะเขือเทศ (0, "มะเขือเทศ"); ผัก (หมายเลข int, คำอธิบายสตริง) {this.code = number; this.description = คำอธิบาย; } รหัส int ส่วนตัว; คำอธิบายสตริงส่วนตัว; @Override สาธารณะ int getCode () {return 0; } @Override สตริงสาธารณะ getDescription () {return null; }} enum ผลไม้ใช้ inumberenum {Apple (0, "Apple"), Orange (0, "Orange"), Banana (0, "Banana"); ผลไม้ (หมายเลข int, คำอธิบายสตริง) {this.code = number; this.description = คำอธิบาย; } รหัส int ส่วนตัว; คำอธิบายสตริงส่วนตัว; @Override สาธารณะ int getCode () {return 0; } @Override สตริงสาธารณะ getDescription () {return null; -ตัวอย่าง: จัดระเบียบ enums ในชั้นเรียน
ตัวอย่างนี้มีเอฟเฟกต์เดียวกันกับตัวอย่างก่อนหน้า
Public Class Plant2 {Public Enum Vegetable ใช้ inumberenum {... } // ละเว้นรหัสสาธารณะ enum ผลไม้ที่ใช้ inumberenum {... } // ละเว้นรหัส}การระบุกลยุทธ์
การแจกแจงกลยุทธ์จะแสดงใน Java ที่มีประสิทธิภาพ การแจงนับนี้จำแนกค่าคงที่ enum โดยการแจกแจงการแจกแจงแบบซ้อนกัน
แม้ว่าวิธีนี้จะไม่กระชับเท่าคำสั่งสวิตช์ แต่ก็ปลอดภัยและยืดหยุ่นมากขึ้น
ตัวอย่าง: ตัวอย่างของการระบุนโยบายใน EffectViejava
enum payrollday {วันจันทร์ (paytype.weekday), วันอังคาร (paytype.weekday), วันพุธ (paytype.weekday), วันพฤหัสบดี (paytype.weekday), วันศุกร์ (paytype.weekday), วันเสาร์ (paytype.weekend), วันอาทิตย์ paytype paytype สุดท้าย Payrollday (paytype paytype) {this.paytype = paytype; } การจ่ายสองครั้ง (สองชั่วโมงที่มีการจ่ายเงินสองเท่า) {return paytype.pay (ชั่วโมงที่ได้รับการชำระเงิน); } // นโยบาย enum ส่วนตัว enum paytype {วันธรรมดา {double overtimepay (สองชั่วโมง, double payrate) {ชั่วโมงการกลับมา <= hours_per_shift? 0: (ชั่วโมง - ชั่วโมง _per_shift) * payrate / 2; }}, วันหยุดสุดสัปดาห์ {double overtimepay (สองชั่วโมง, double payrate) {ชั่วโมงส่งคืน * payrate / 2; - int คงสุดท้ายส่วนตัว int ชั่วโมง _per_shift = 8; บทคัดย่อคู่เกินค่า (สองชั่วโมง, การจ่ายเงินสองครั้ง); จ่ายสองเท่า (สองชั่วโมงที่ผ่านมา, จ่ายสองเท่า) {double basepay = hoursworked * payrate; ส่งคืน basepay + overtimepay (hoursworked, payrate); -ทดสอบ
System.out.println ("รายได้สำหรับผู้ที่ได้รับค่าจ้าง 100 ชั่วโมงต่อชั่วโมงในวันศุกร์เป็นเวลา 8 ชั่วโมง:" + Payrollday.friday.pay (8.0, 100)); System.out.println ("รายได้สำหรับผู้ที่ได้รับค่าจ้าง 100 ชั่วโมงต่อชั่วโมงในวันเสาร์เป็นเวลา 8 ชั่วโมง:" + Payrollday.saturday.pay (8.0, 100));enumset และ enummap
Java มีคลาสเครื่องมือสองคลาสที่สะดวกสำหรับการใช้งาน enum - Enumset และ ENUMMAP
EnumSet เป็น Set การดำเนินการที่มีประสิทธิภาพสูงของประเภท enum มันต้องการให้ค่าคงที่ enum ที่วางไว้ในนั้นจะต้องอยู่ในประเภท enum เดียวกัน
EnumMap เป็นการใช้งานแผนที่ที่เหมาะสำหรับประเภท enum แม้ว่าการใช้การใช้งาน Map อื่น ๆ (เช่น HASHMAP) ยังสามารถทำอินสแตนซ์ประเภท enum ให้เสร็จสมบูรณ์ในการทำแผนที่ค่าการใช้ enummap นั้นมีประสิทธิภาพมากขึ้น: สามารถรับอินสแตนซ์ของประเภท enum เดียวกันเป็นค่าคีย์และเนื่องจากจำนวนอินสแตนซ์ชนิด enum ค่อนข้างคงที่และ จำกัด สิ่งนี้ทำให้ enummap มีประสิทธิภาพมาก
// การใช้ EnumSet System.out.println ("enumset display"); enumset <srorcodeen> errset = enumset.allof (errorcodeen.class); สำหรับ (errorcodeen e: errset) {system.out.println (e.name () + ":" + e.ordinal ());} // การใช้ enummap system.out.println ("enummap display"); enummap <Statemachine.signal, string> errmap = new enummap (statemachine.signal.class); errmap.put (statemachine.signal.red, "แสงสีแดง"); errmap.put (statemachine.signal.yellow, "เหลือง"); errmap.put (statemachine.signal.green, "Green Light") errmap.entryset (). iterator (); System.out.println (entry.getKey (). name () + ":" + entry.getValue ());}ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น