การแจกจ่าย
Enumset เป็นภาชนะทั่วไปของประเภท enum Java เนื่องจาก java มีชุด, treeet, hashset และภาชนะอื่น ๆ ทำไมจึงต้องมี enumset เพิ่มเติม <t>? คำตอบคือ Enumset มีลักษณะบางอย่าง ตัวอย่างเช่น enumset เร็วมาก ฉันจะไม่แสดงรายการคุณสมบัติอื่น ๆ ทีละรายการเนื้อหาของบทความนี้ไม่ได้แนะนำคุณสมบัติของ Enumset
คลาสคอลเลกชันที่ออกแบบมาโดยเฉพาะสำหรับคลาสการแจงนับองค์ประกอบทั้งหมดจะต้องเป็นประเภทการแจงนับ
องค์ประกอบที่ตั้งไว้ของ enumset ได้รับการสั่งซื้อและจัดเก็บภายในด้วยเวกเตอร์บิตดังนั้นพวกเขาจึงมีหน่วยความจำน้อยลงและมีประสิทธิภาพสูง
ไม่อนุญาตให้ใช้องค์ประกอบว่าง
รหัสต้นฉบับ
แพ็คเกจ java.util; นำเข้า sun.misc.sharedsecrets; enumset คลาสนามธรรมสาธารณะ <e ขยาย enum <e >> ขยายบทคัดย่อ <e> ใช้ cloneable, java.io.serializable { / *** ประเภทองค์ประกอบ* / คลาสสุดท้าย <e> องค์ประกอบ; / *** จัดเก็บองค์ประกอบผ่านอาร์เรย์*/ final enum [] จักรวาล; enum คงที่ส่วนตัว [] zero_length_enum_array = new enum [0]; Enumset (คลาส <e> elementType, enum [] จักรวาล) {this.elementType = elementType; this.universe = จักรวาล; }/** * สร้างชุด enum ที่ว่างเปล่าและกำหนดประเภทองค์ประกอบของมัน * @param elementType วัตถุคลาสของประเภทองค์ประกอบสำหรับ enum นี้ * set * @throws nullpointerexception ถ้า <tt> elementtype </tt> เป็น null */สาธารณะ getUniverse (ElementType); if (iverse == null) โยน classcastexception ใหม่ (ElementType + "ไม่ใช่ enum"); if (universe.length <= 64) คืนค่าปกติใหม่ <> (ElementType, Universe); อื่น ๆ ส่งคืน jumboenumset ใหม่ <> (ElementType, Universe); }/** * สร้าง enum ที่มีองค์ประกอบทั้งหมดในชุดประเภทองค์ประกอบที่ระบุ * * @param elementType วัตถุคลาสของประเภทองค์ประกอบสำหรับ enum นี้ * ตั้งค่า * @throws nullpointerexception ถ้า <tt> elementType </tt> เป็น null */สาธารณะ ไม่มีของ (ElementType); result.addall (); ผลการกลับมา; } /** * เพิ่มองค์ประกอบทั้งหมดจากประเภท enum ที่เหมาะสมไปยังชุด enum * นี้ซึ่งว่างเปล่าก่อนการโทร */ บทคัดย่อเป็นโมฆะ Addall (); /** * สร้างชุด enum ด้วยประเภทองค์ประกอบเดียวกันกับชุด enum ที่ระบุ * * @param s ชุด enum ที่จะเริ่มต้นชุด enum นี้ * @throws nullpointerexception ถ้า <tt> s </tt> เป็นโมฆะ */สาธารณะ }/** * สร้างชุด enum ที่จะเริ่มต้นชุด enum นี้ * @throws unledalargumentexception ถ้า <tt> c </tt> ไม่ใช่อินสแตนซ์ * <tt> enumset </tt> และไม่มีองค์ประกอบ * @throws c) {ถ้า (c instanceof enumset) {return ((enumset <e>) c) .clone (); } else {ถ้า (c.isempty ()) โยน unlegalargumentException ใหม่ ("คอลเลกชันว่างเปล่า"); ตัววนซ้ำ <e> i = c.iterator (); e แรก = i.next (); Enumset <e> result = enumset.of (ก่อน); ในขณะที่ (i.hasnext ()) result.add (i.next ()); ผลการกลับมา; }}/** * สร้างชุด enum จากที่มีส่วนประกอบเพื่อเริ่มต้นชุด enum นี้ * @throws nullpointerexception ถ้า <tt> s </tt> เป็น null */สาธารณะคงที่ <e ขยาย enum <e >> enumset <e> ส่วนประกอบ (enumset <e> s) {enumset <e> result.complement (); ผลการกลับมา; }/** * 1 คอลเลกชันการแจงนับองค์ประกอบ * * @param e องค์ประกอบที่ชุดนี้จะมีตอนแรก * @throws nullpointerexception ถ้า <tt> e </tt> เป็น null * @return ชุด enum เริ่มต้นที่มีองค์ประกอบที่ระบุ */สาธารณะ ไม่มี (e.getDeclaringClass ()); result.add (e); ผลการกลับมา; } / ** * 2 คอลเลกชันการแจงนับองค์ประกอบ * * @param e1 องค์ประกอบที่ชุดนี้มีอยู่ในขั้นต้น * @param e2 องค์ประกอบอื่นที่ชุดนี้จะมีตอนแรก * @throws nullpointerexception หากพารามิเตอร์ใด ๆ เป็น null * @return ชุด enum เริ่มต้น enumset <e> result = noneof (e1.getDeclaringClass ()); result.add (e1); result.add (e2); ผลการกลับมา; } / ** * 3 คอลเลกชันการรวมองค์ประกอบ * * @param e1 องค์ประกอบที่ชุดนี้มีอยู่ในขั้นต้น * @param e2 องค์ประกอบอื่นที่ชุดนี้จะมีตอนแรก * @param e3 องค์ประกอบอื่นที่ชุดนี้จะมีตอนแรก * @throws nullpointerexception Enumset <e> ของ (e e1, e e2, e e3) {enumset <e> result = noneof (e1.getDeclaringClass ()); result.add (e1); result.add (e2); result.add (e3); ผลการกลับมา; } / ** * 4 ชุดการแจกแจงองค์ประกอบ * @param e1 องค์ประกอบที่ชุดนี้คือการมีเริ่มแรก * @param e2 องค์ประกอบอื่นที่ชุดนี้จะมีตอนแรก * @param e3 องค์ประกอบอื่นที่ชุดนี้คือการเริ่มต้น * @param e4 องค์ประกอบอื่น ๆ <e ขยาย enum <e >> enumset <e> ของ (e e1, e e2, e e3, e e4) {enumset <e> result = noneof (e1.getDeclaringClass ()); result.add (e1); result.add (e2); result.add (e3); result.add (e4); ผลการกลับมา; } /** * 5 คอลเลกชันการแจงนับองค์ประกอบ * * @param e1 องค์ประกอบที่ชุดนี้มีอยู่ในขั้นต้น * @param e2 องค์ประกอบอื่นที่ชุดนี้จะมีตอนแรก * @param e3 องค์ประกอบอื่นที่ชุดนี้จะมีเริ่มต้น * @param e4 ชุด enum เริ่มแรกที่มีองค์ประกอบที่ระบุ */ สาธารณะคงที่ <e ขยาย enum <e >> enumset <e> ของ (e e1, e e2, e e3, e e e4, e e5) {enumset <e> result = noneof (e1.getDeclaringClass (); result.add (e1); result.add (e2); result.add (e3); result.add (e4); result.add (e5); ผลการกลับมา; }/** * n * * @param องค์ประกอบแรกที่ชุดคือการมีตอนแรก * @param พักองค์ประกอบที่เหลืออยู่ชุดจะมีตอนแรก * @throws nullpointerexception หากองค์ประกอบใด ๆ ที่ระบุเป็นโมฆะ enum <e >> enumset <e> ของ (e แรก, e ... rest) {enumset <e> result = noneof (first.getDeclaringClass ()); result.add (ครั้งแรก); สำหรับ (e e: rest) result.add (e); ผลการกลับมา; } /** * รวบรวมองค์ประกอบขององค์ประกอบในช่วง * @param จากองค์ประกอบแรกในช่วง * @param ไปยังองค์ประกอบสุดท้ายในช่วง * @throws nullpointerexception ถ้า {@code จาก} หรือ {@code ถึง} เป็น null * @throws องค์ประกอบในช่วง * ที่กำหนดโดยจุดสิ้นสุดที่ระบุสองจุด */ สาธารณะคงที่ <e ขยาย enum <e >> enumset <e> ช่วง (e จาก, e ถึง) {ถ้า (จาก. compareto (ถึง)> 0) โยน unledalargumentException ใหม่ (จาก + ">" + ถึง); Enumset <e> result = noneof (จาก. getDeclaringClass ()); result.addrange (จาก, ถึง); ผลการกลับมา; } /** * เพิ่มช่วงที่ระบุในชุด enum นี้ซึ่งว่างก่อนหน้า * ไปยังการโทร */ บทคัดย่อเป็นโมฆะ addrange (e จาก, e ถึง); /*** ส่งคืนสำเนาของชุดนี้ * * @return สำเนาของชุดนี้ */ public enumset <e> clone () {ลอง {return (enumset <e>) super.clone (); } catch (clonenotsupportedException e) {โยน assertionError ใหม่ (e); }} /*** เติมเต็มเนื้อหาของชุด enum นี้ */ บทคัดย่อโมฆะส่วนประกอบ (); /*** โยนข้อยกเว้นหาก E ไม่ใช่ประเภทที่ถูกต้องสำหรับชุด enum นี้ */ void final typecheck (e e) {class eclass = e.getClass (); if (eclass! = elementType && eclass.getSuperClass ()! = elementType) โยน classcastexception ใหม่ (eclass + "! =" + elementType); } /** * ส่งคืนค่าทั้งหมดที่ประกอบด้วย E * ผลลัพธ์จะไม่ได้รับการรับรองแคชและแชร์โดยผู้โทรทั้งหมด */ private static <e ขยาย enum <e >> e [] getUniverse (คลาส <e> elementType) {return SharedSecrets.getJavalangaccess () .getenumconstantsshared (ElementType); } /** * คลาสนี้ใช้เพื่อทำให้เป็นอนุกรมอินสแตนซ์ทั้งหมดโดยไม่คำนึงถึง * ประเภทการใช้งาน มันจับ "เนื้อหาเชิงตรรกะ" ของพวกเขาและพวกเขา * ถูกสร้างขึ้นใหม่โดยใช้โรงงานคงที่สาธารณะ สิ่งนี้จำเป็น * เพื่อให้แน่ใจว่าการมีอยู่ของประเภทการใช้งานเฉพาะคือ * รายละเอียดการใช้งาน * * @Serial รวมถึง * / ส่วนตัวคลาสคงที่ระดับการจัดสรร Proxy <e ขยาย enum <e >> ใช้ java.io.serializable { / ** * ประเภทองค์ประกอบของชุด enum นี้ * * @Serial */ คลาสสุดท้ายส่วนตัว <E> ElementType; /*** องค์ประกอบที่มีอยู่ในชุด enum นี้ * * @Serial */ ELEMENTS ELEMENTS [] ส่วนตัว; serializationProxy (enumset <e> set) {elementType = set.elementType; องค์ประกอบ = set.toArray (zero_length_enum_array); } วัตถุส่วนตัว readResOlve () {EnumSet <E> result = enumSet.noneof (ElementType); สำหรับ (enum e: องค์ประกอบ) result.add ((e) e); ผลการกลับมา; } ส่วนตัวคงที่สุดท้าย Long SerialVersionUID = 362491234563181265L; } Object WriteReplace () {ส่งคืน serializationproxy ใหม่ <> (this); } // วิธี readObject สำหรับรูปแบบพร็อกซีแบบอนุกรม // ดู java ที่มีประสิทธิภาพ, ed., รายการ 78. โมฆะส่วนตัว readobject (java.io.oBjectInputStream สตรีม) โยน java.io.invalidObjectException -สรุป
ข้างต้นคือทั้งหมดที่เกี่ยวกับการอ่านซอร์สโค้ดนามธรรม Enumset และฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!