enum คืออะไร?
การแจงนับเป็นคุณสมบัติใหม่ที่แนะนำโดย JDK5 ในบางกรณีวัตถุของคลาสได้รับการแก้ไขและสามารถกำหนดเป็น enum ในการใช้งานจริงประเภทการแจงนับยังสามารถใช้เป็นข้อกำหนดเพื่อให้แน่ใจว่าความปลอดภัยของพารามิเตอร์โปรแกรม การแจงนับมีลักษณะดังต่อไปนี้:
java.lang.Enum ใน Java โดยค่าเริ่มต้นและใช้สองอินเตอร์เฟส: java.lang.Seriablizable และ java.lang.Comparablepublic static final และคลาสการแจงนับที่ไม่ใช่แบบไม่ได้รับการรับรองไม่สามารถรับคลาสย่อยได้ นี่คือ equals() ในคลาส java.lang.Enum :
// นี่คือการแก้ไขขั้นสุดท้ายและคลาสย่อยไม่ได้รับอนุญาตให้เขียนบูลีนสุดท้ายของสาธารณะเท่ากับ (วัตถุอื่น ๆ ) {ส่งคืนสิ่งนี้ == อื่น ๆ } วิธีการทั่วไปสำหรับการแจงนับ
int compareTo(E o)
เปรียบเทียบลำดับของ enum นี้กับวัตถุที่ระบุ เมื่อวัตถุน้อยกว่าเท่ากับหรือมากกว่าวัตถุที่ระบุจำนวนเต็มลบจำนวนเต็มศูนย์หรือจำนวนเต็มบวกจะถูกส่งกลับตามลำดับ ค่าคงที่การแจงนับสามารถนำมาเปรียบเทียบกับค่าคงที่การแจงนับอื่น ๆ ของประเภท enum เดียวกันเท่านั้น
// ซอร์สโค้ดใน Enum Public Final Int Compareto (E O) {enum อื่น ๆ = (enum) o; enum self = this; if (self.getClass ()! = other.getClass () && // การเพิ่มประสิทธิภาพ self.getDeclaringClass ()! = other.getDeclaringClass ()) โยน classcastexception ใหม่ (); Return Self.ordinal - อื่น ๆ . ordinal;} String name()
ส่งคืนชื่อของอินสแตนซ์ enum นี้
static values()
ส่งคืนอาร์เรย์ที่มีค่า enum ทั้งหมดที่สามารถใช้ซ้ำผ่านค่า enum ทั้งหมด
String toString()
ส่งคืนชื่อของอินสแตนซ์ enum นี้นั่นคือค่า enum เหมือนกับ name()
// name () และ toString () ใน enum public String toString () {return name;} ชื่อสตริงสุดท้ายสาธารณะ () {return name;} int ordinal()
ส่งคืนค่าดัชนีของค่า enum ในคลาส enum (เริ่มต้นจาก 0) นั่นคือลำดับของค่า enum ในการประกาศ enum ซึ่งขึ้นอยู่กับคำสั่งของการประกาศค่า enum
<T extends Enum<T>> valueOf()
ส่งคืนค่าคงที่การแจงนับของประเภท enum ที่ระบุด้วยชื่อที่ระบุชื่อจะต้องตรงกับตัวระบุที่ใช้ในการประกาศค่าคงที่การแจงนับในประเภทนี้ (ไม่อนุญาตให้ใช้อักขระพิเศษช่องว่าง) วิธีนี้สอดคล้องกับ toString ดังนั้นหากเราแทนที่วิธี toString() เราจะต้องแทนที่ valueOf() (เราสามารถแทนที่วิธี toString() toString() แต่เราไม่สามารถแทนที่ valueOf() valueOf() ) ด้วยตัวเอง
การประยุกต์ใช้การแจงนับ
การแจงนับเป็นประเภทพิเศษและการใช้งานนั้นคล้ายกับชั้นเรียนธรรมดามาก
แทนที่ชุดค่าคงที่
สี enum สาธารณะ {สีแดง, เขียว, ว่างเปล่า, สีเหลือง} ใช้ในคำสั่งสวิตช์
// สวิตช์ได้เพิ่มการรองรับ enum ใน jdk1.6 enum สัญญาณ {สีเขียว, สีเหลือง, สีแดง} ... สวิตช์ (สี) {case red: color = signal.green; หยุดพัก; - เพิ่มวิธีการใน enum
สี enum สาธารณะ {สีแดง ("สีแดง"), สีเขียว ("สีเขียว"), ว่างเปล่า ("สีขาว"), เยลโล ("เหลือง"); // สมาชิกตัวแปรชื่อสตริงส่วนตัว; // constructor สีส่วนตัว (ชื่อสตริง) {this.name = name; } // รับวิธีการตั้งค่าสตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; - ใช้อินเทอร์เฟซ
พฤติกรรมการเชื่อมต่อสาธารณะ {void print (); } public enum สีใช้พฤติกรรม {สีแดง ("สีแดง", 1), สีเขียว ("สีเขียว", 2), ว่างเปล่า ("ขาว", 3), เยลโล ("เหลือง", 4); // เมธอดอินเตอร์เฟส @Override โมฆะสาธารณะพิมพ์ () {System.out.println (this.index+":"+this.name); - คลาสการแจงนับที่มีวิธีการนามธรรม
การดำเนินการ enum สาธารณะ {// ใช้ในการดำเนินการเพิ่มเติมรวมถึง {// ส่วนการจัดฟันเป็นจริงจริง ๆ แล้วการคำนวณสองชั้นภายในที่ไม่ระบุชื่อ @Override การคำนวณสองครั้งสาธารณะ (double x, double y) {return x + y; }}, // ใช้ในการดำเนินการลบลบลบ {// ส่วนการจัดฟันเป็นจริงจริง ๆ แล้วการคำนวณสองชั้นภายในที่ไม่ระบุชื่อ @Override การคำนวณสองครั้งสาธารณะ (double x, double y) {// วิธีการที่สร้างอัตโนมัติ }}, // ใช้ในการดำเนินการคูณการดำเนินการครั้ง {// ส่วนการจัดฟันเป็นจริงจริง ๆ แล้วการคำนวณสองชั้นภายในที่ไม่ระบุชื่อ @Override สาธารณะการคำนวณสองเท่า (double x, double y) {return x * y; }}, // ใช้เพื่อดำเนินการหารหาร {// ส่วนการจัดฟันแบบหยิกเป็นจริงจริง ๆ แล้วเป็น subclass ภายในที่ไม่ระบุชื่อ @Override สาธารณะคำนวณสองเท่า (double x, double y) {return x / y; - // กำหนดวิธีนามธรรมสำหรับคลาสการแจงนับนี้ ค่า enum ทั้งหมดในคลาสการแจงนับจะต้องใช้วิธีนี้การคำนวณแบบนามธรรมสาธารณะสองครั้ง (double x, double y);} การใช้ Singletons ด้วยการแจกแจง (แนวปฏิบัติที่ดีที่สุดสำหรับ Singletons)
ผลประโยชน์:
1. ใช้คุณสมบัติของการแจงนับเพื่อใช้กรณีเดี่ยว
2. JVM รับรองความปลอดภัยของด้าย
3. การทำให้เป็นอนุกรมและการโจมตีแบบสะท้อนกลับได้รับการแก้ไขโดยการแจงนับ
Public Enum Singleton {อินสแตนซ์; Public Singleton GetInstance () {// เพิ่มวิธีนี้เพื่อให้ผู้อื่นเข้าใจวิธีการใช้เพราะวิธีการใช้งานนี้ค่อนข้างหายาก อินสแตนซ์กลับ; - การใช้การแจงนับอื่น ๆ
การแจกจ่าย
range(E from, E to)
รับช่วงของชุดจากค่า enum
สำหรับ (วันธรรมดาวัน: enumset.Range (WeekdayEnum.mon, Weekdayenum.fri)) {System.out.println (วัน); - of(E first, E... rest)
สร้างชุดการแจงนับที่เดิมมีองค์ประกอบที่ระบุ
noneOf(Class<E> elementType)
สร้างชุดการแจงนับที่ว่างเปล่าด้วยประเภทองค์ประกอบที่ระบุ
enummap
EnumMap(Class<K> keyType)
สร้างแผนที่การแจงนับที่ว่างเปล่าด้วยประเภทคีย์ที่ระบุ
แผนที่ <สภาพอากาศ, สตริง> enummap = ใหม่ enummap <สภาพอากาศ, สตริง> (สภาพอากาศ); enummap.put (Weather.sunny, "Sunny"); enummap.put (Weather.rainy, "Rainy");
การแจงนับใน Android
Enum ต้องครอบครองหน่วยความจำจำนวนมาก หากมีความอ่อนไหวต่อหน่วยความจำโปรดลองใช้ enum ให้น้อยที่สุดและแทนที่ด้วยค่าคงที่คงที่
อย่างไรก็ตามหากคุณไม่ได้ใช้การแจงนับความเสี่ยงด้านความปลอดภัยบางอย่างจะเกิดขึ้นดังนั้นเจ้าหน้าที่ได้เปิดตัวสองคำอธิบายประกอบซึ่งสามารถตรวจสอบได้ในช่วงระยะเวลาการรวบรวมเพื่อแทนที่การแจงนับ คำอธิบายประกอบทั้งสองนี้คือ: @intdef และ @stringdef ตั้งอยู่ในคอมไพล์ 'com.android.support:support-Annotations:+'
ตัวอย่างการใช้งาน
การใช้ @StringDef สอดคล้องกับ @intdef ที่นี่เราใช้ @intdef เป็นตัวอย่าง
ส่วนต่อประสานสาธารณะ qrcodeType {int weChat = 0; int alipay = 1; @intdef ({weChat, Alipay}) @retention (RetentionPolicy.Source) @Target ({ElementType.field, ElementType.method, ElementType.Parameter}) @interface Checker โมฆะสาธารณะ setType (@qrcodeType.Checker int ประเภท) {// กำหนดในพารามิเตอร์ this.type = type; } @qrcodeType.checker // กำหนดในวิธีการ (นั่นคือตรวจสอบประเภทของค่าส่งคืน) สาธารณะ int getType () {ประเภทการส่งคืน; - คำแนะนำสำหรับการใช้งาน
ช่วงที่ใช้กันอย่างแพร่หลายในการพัฒนาคือการใช้การแจกแจงแทนชุดค่าคงที่คงที่ ในกรณีนี้สามารถใช้วิธีการเพิ่มความคิดเห็นข้างต้นแทนได้
เมื่อการแจงนับยังมีฟังก์ชั่นอื่น ๆ (เช่น: รวมถึงวิธีการอื่น ๆ ที่กำหนด) จะไม่สามารถเปลี่ยนได้
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะช่วยในการศึกษาหรือทำงานของคุณ หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร