เกี่ยวกับการแจงนับ
enums ส่วนใหญ่ที่เขียนในสถานที่จะได้รับ enum จากนั้นตัวอย่างเริ่มสลับ แต่ฉันอยากจะบอกว่าข้อมูลจากรหัสของฉันไม่น่าจะเป็น enums โดยปกติแล้วสตริงหรือตัวเลข ตัวอย่างเช่นหลังจากแยก SQL ฉันจะกำหนดประเภท SQL ก่อน โดยการสกัดโทเค็น SQL การสกัดกั้นอาจถูกเลือกลบการอัปเดตแทรกการเปลี่ยนแปลง ฯลฯ แต่เป็นสตริงทั้งหมด ในเวลานี้ฉันต้องการใช้ enums แต่ฉันทำไม่ได้ จะแปลงสตริงเป็น enum ได้อย่างไร? สถานการณ์ที่คล้ายกันรวมถึงการดึงข้อมูลจากฐานข้อมูลและการตัดสินตามบางประเภทการส่งข้อมูลจากหน้าและการดำเนินการที่แตกต่างกันตามประเภทที่แตกต่างกัน แต่เป็นสตริงทั้งหมดไม่ใช่ enums โศกนาฏกรรมคือฉันไม่ค่อยเห็นใครเขียนสิ่งนี้ ดังนั้นฉันจึงเขียนมันลงโดยหวังว่าจะมีคนใช้มันได้
ก่อนอื่นทำไมต้องใช้การแจงนับ? จะใช้ enums ดีกว่าเมื่อใด ข้อดีของการใช้ enums คืออะไร?
ฉันคิดว่าเมื่อคุณอยู่ในบางคลาสคลาสและสามารถระบุประเภทและไม่เปลี่ยนแปลงเพื่อเป็นแนวทางในการกำหนดเส้นทางไปยังสถานที่ต่าง ๆ โดยใช้การแจงนับเป็นตัวเลือกที่ดีกว่า
มันฟังดูสับสนเล็กน้อย แต่มีตัวอย่างที่อาจเข้าใจได้เช่น:
เราสามารถแสดงรายการสิ่งที่เราทำในวันทำงานประจำวันของเรา:
ไปทำงานมีการประชุมกินนอน ฯลฯ
เราสามารถแสดงรายการชิ้นส่วนที่ต้องตรวจสอบโดยแผนก ENT ของโรงพยาบาล:
ดวงตาจมูกหูปาก ฯลฯ
สิ่งเหล่านี้สามารถระบุได้และเราต้องทำแต่ละอย่างในวิธีที่แตกต่างกัน
แน่นอนคุณสามารถพูดได้ว่า:
1. สามารถส่งแบบไดนามิกผ่านไฟล์การกำหนดค่าหรือคำอธิบายประกอบ;
2. ค่าคงที่สามารถใช้เพื่อให้ได้ผลที่คล้ายกัน;
3. แสดงโดยตรงผ่านเท่ากับของสตริงและแสดงด้วยหากอื่น
หากคุณใช้วิธีการเพิ่มการกำหนดค่าเพื่อส่งมันมีความยืดหยุ่นและง่ายต่อการแก้ไข แต่ถ้าเราใช้พารามิเตอร์จำนวนมากที่ไม่ได้แก้ไขบ่อยครั้งเรามักจะเพิ่มภาระของการกำหนดค่าและเมื่อคุณต้องการอ่านตรรกะของระบบคุณต้องอ่านการกำหนดค่าและรหัสอีกครั้ง อย่างไรก็ตามหากพารามิเตอร์เป็นข้อมูลที่สามารถแปลงได้แบบไดนามิกการใช้การกำหนดค่าเป็นตัวเลือกที่ถูกต้อง
การใช้ค่าคงที่มักจะเป็นตัวเลขเมื่อเปลี่ยนกรณีและสตริงไม่สามารถเปลี่ยนกรณีใน Java ได้ วัตถุประสงค์ของการใช้ค่าคงที่เพิ่มความสามารถในการอ่านได้มากกว่ากรณีที่ 1 และกรณีที่ 2 ... แต่ข้อมูลสตริงก็ลำบากเช่นกัน เว้นแต่จะถูกแมปอีกครั้งไม่มีความจำเป็น ในความเป็นจริงการแจงนับเกือบจะแมปสำหรับคุณหนึ่งครั้ง แต่มันแค่ห่อหุ้มรหัส เนื่องจากได้รับการสนับสนุนและรองรับวากยสัมพันธ์ทำไมไม่ใช้มัน! ประการที่สองแม้ว่าค่าคงที่เพิ่มความสามารถในการอ่าน แต่พวกเขาไม่มีแนวคิดของหมวดหมู่และประเภทการจัดการ นั่นคือคำจำกัดความของ enum กำหนดหมวดหมู่ซึ่งสามารถแสดงรายการสิ่งที่จำเป็นสำหรับช่วงนี้ได้ดี ค่าคงที่มักจะเป็นสระว่ายน้ำบางส่วนที่กำหนดไว้ในตัวเองบางชั้นหรือกำหนดแบบสุ่มและค่อนข้างกระจัดกระจาย นอกจากนี้ enum จะถูกกำหนดอย่างชัดเจนเมื่อทำการสลับและเคสอยู่ในช่วงของการแจงนับล็อค ไม่เพียง แต่สามารถควบคุมระบบเพิ่มความสามารถในการอ่าน แต่ยังตรวจสอบว่าข้อมูล enum ใดในหมวดหมู่นี้เป็นเวลาใด ๆ เพื่อให้ได้ฟังก์ชั่นการดูไฟล์การกำหนดค่า แต่มันก็ยังคงกลับมาในประโยคนั้นหากพารามิเตอร์เป็นตัวแปรก็ไม่เหมาะสำหรับการแจงนับ การแจกแจงจะต้องมีการแจกแจงหรือการพิจารณาระบบปัจจุบันสามารถแจกแจงได้ ตัวอย่างเช่นอาจมีโรงพยาบาลหลายแห่งในโรงพยาบาลข้างต้น แต่โรงพยาบาลปัจจุบันดำเนินการเพียงไม่กี่ส่วนและไม่ได้ดำเนินการอื่น ๆ นี่คือเหตุผล ตัวแปรคืออะไร? ตัวอย่างเช่นพารามิเตอร์ URL จะถูกส่งไปยังวิธีการที่สอดคล้องกัน เป็นไปไม่ได้ที่ทุกคนจะเพิ่มตรรกะและเพิ่มตัวแจงนับและเคส ในเวลานี้จะเป็นการดีกว่าที่จะใช้ [การกำหนดค่า + วิธีการส่งแบบไดนามิก] แน่นอนการกำหนดค่าอาจเป็นเพียงไฟล์หรือคำอธิบายประกอบ
สิ่งที่เรียบง่ายที่สุดคือการใช้สตริงเท่ากับการใช้งานหากอื่น ฮ่าฮ่าไม่มีอะไรผิดปกติกับเรื่องนี้ แต่สิ่งนี้เขียนขึ้นอย่างกระจัดกระจาย ประการที่สองการจับคู่แต่ละครั้งจะต้องเปรียบเทียบกับตัวละครแต่ละตัวทุกครั้งที่คุณจับคู่เท่ากับ หากคุณวนซ้ำในรหัสของคุณประสิทธิภาพการทำงานไม่ดีมากและส่วนที่เหลือจะชัดเจนขึ้นหลังจากดูคำอธิบายข้างต้น
ประการที่สองการแจงนับให้องค์ประกอบการจัดการประเภททำให้ระบบที่มุ่งเน้นวัตถุสมบูรณ์แบบมากขึ้นเพื่อให้สามารถกำหนดค่าและจัดการการจัดการบางประเภทได้ ในกรณีที่มีการใช้การแจงนับคุณสามารถค้นหาคำจำกัดความของการแจงนับที่ได้รับการประมวลผลและยังไม่ได้รับการประมวลผลและข้างต้นเป็นเรื่องยากที่จะบรรลุ ตัวอย่างเช่นมีประเภทการทำงาน 10 ประเภทที่กำหนดไว้ในฐานข้อมูลดังนั้นในกระบวนการพิจารณาการแจงนับสามารถดูได้เช่นไฟล์การกำหนดค่าและมันง่ายมากที่จะจัดการ
ในที่สุดการแจงนับเป็นซิงเกิลอย่างแน่นอนและประสิทธิภาพของการเปรียบเทียบนั้นเปรียบได้กับประสิทธิภาพของดิจิตอลซึ่งทั้งคู่สามารถอ่านได้และประสิทธิภาพ
การใช้ประเภท enum ขั้นพื้นฐาน
ด้วยพื้นฐานทางทฤษฎีลองมาดูประเภท enum enum ใน Java:
1. คุณสามารถเพิ่มตัวแปรและวิธีการในการ enum
มาดูตัวอย่างรหัส:
สถานะ enum สาธารณะ {ปกติ ("ปกติ", 1), อัปเดต ("อัปเดต", 2), ลบ ("ลบ", 3), ยิง ("สวมหน้ากาก", 4); // สมาชิกตัวแปรชื่อสตริงส่วนตัว; ดัชนี INT ส่วนตัว // วิธีการสร้าง, หมายเหตุ: ตัวสร้างไม่สามารถสาธารณะได้เนื่องจาก enum ไม่สามารถเป็นสถานะส่วนตัว (ชื่อสตริง, ดัชนี int) {this.name = name; this.index = ดัชนี; } // วิธีปกติสตริงคงที่สาธารณะ getName (ดัชนี int) {สำหรับ (สถานะ C: state .values ()) {ถ้า (c.getIndex () == ดัชนี) {return c.name; }} return null; } // รับวิธีการตั้งค่าสตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } public int getIndex () {return index; } โมฆะสาธารณะ setIndex (ดัชนี int) {this.index = index; -จากรหัสข้างต้นเราจะเห็นได้ว่าหลังจากกำหนดค่า enum จากนั้นเพิ่มเครื่องหมายอัฒภาคลงไปแล้วคุณสามารถกำหนดตัวแปรและวิธีการอื่น ๆ ได้ ควรสังเกตโดยเฉพาะอย่างยิ่งว่าวิธีการก่อสร้างใน enum ไม่สามารถระบุได้โดยสาธารณะดังนั้นสิ่งนี้จะทำเพื่อป้องกันไม่ให้ผู้ใช้อินสแตนซ์ enum
2. สามารถใช้เพื่อกำหนดค่าคงที่
ลองทบทวนวิธีกำหนดค่าคงที่ใน Java ก่อนและดูรหัสต่อไปนี้:
public Static Final Int NormalState = 1; INT updateState สุดท้ายส่วนตัว = 2;
ด้านล่างเรายังสามารถใช้ enum enum เพื่อแทนที่คำจำกัดความคงที่ด้านบนรหัสมีดังนี้:
สถานะ enum สาธารณะ {ปกติ, อัปเดต, ลบ, ถูกยิง}ไม่มีข้อได้เปรียบทางไวยากรณ์ในการใช้ enum เพื่อกำหนดค่าคงที่ใน Java แต่ประเภท enum enum สามารถให้ฟังก์ชั่นการทำงานมากขึ้น
3. ใช้อินเทอร์เฟซใน enum
ก่อนอื่นดูรหัสต่อไปนี้:
อินเตอร์เฟสสาธารณะ icanreadState {void read (); String getState ();} สถานะ enum สาธารณะใช้ icanreadState {ปกติ ("ปกติ", 1), อัปเดต ("อัปเดต", 2), ลบ ("ลบ", 3), ยิง ("สวมหน้ากาก", 4); ชื่อสตริงส่วนตัว; ดัชนี INT ส่วนตัว สถานะส่วนตัว (ชื่อสตริง, ดัชนี int) {this.name = name; this.index = ดัชนี; } // เมธอดอินเตอร์เฟส 1 @Override สตริงสาธารณะ getState () {return this.name; } // เมธอดอินเตอร์เฟส 2 @Override โมฆะสาธารณะอ่าน () {system.out.println (this.index + ":" + this.name); -เช่นเดียวกับการใช้อินเทอร์เฟซในคลาสทั่วไป enum enum ยังสามารถสืบทอดอินเตอร์เฟสและใช้วิธีทั้งหมดในอินเทอร์เฟซ ข้อดีของสิ่งนี้คือมันสามารถเรียงลำดับการเปรียบเทียบและการดำเนินการอื่น ๆ ที่สะดวกยิ่งขึ้นเกี่ยวกับค่าใน enum และมีการห่อหุ้มที่ดีกว่า
ตัวอย่าง
ก่อนอื่นให้กำหนด enum ง่าย ๆ (นี่เป็นเพียงตัวอย่างดังนั้นเราจะกำหนดตัวแปร 3 ตัว):
public enum sqltypeenum {แทรก, อัปเดต, ลบ, เลือก}หลังจากแยกวิเคราะห์ SQL จะได้รับโทเค็น เราจะได้รับโทเค็นนี้ได้อย่างไร?
รับแบบนี้:
สตริงโทเค็น = "เลือก"; sqltypeenum sqltypeenum = sqltypeenum.valueof (token.touppercase ());
หากไม่ได้รับ Java จะโยนข้อยกเว้น: unglegalargumentException ไม่มี enum const คลาส sqltypeenum.xxx
เหตุผลที่ฉันทำทุนเป็นเพราะ enums ก็เป็นตัวพิมพ์ใหญ่ (แน่นอนถ้า enum ของคุณเป็นตัวพิมพ์เล็กคุณจะเป็นตัวพิมพ์เล็ก แต่มันก็ลำบากกว่าที่จะผสมมัน) ในความเป็นจริงค่าของการเรียกใช้การทำแผนที่พื้นฐานของ enum:
วิธีนี้จะถูกเรียกเมื่อโทร:
ดังนั้นยังมี hashmap อยู่ข้างในฮ่าฮ่า!
หลังจากได้รับข้อมูลนี้คุณสามารถดำเนินการที่ต้องการได้:
สวิตช์ (sqltypeenum) {case insert: จัดการกับการแทรกตรรกะ; หยุดพัก; เคสลบ: จัดการการลบลอจิก; หยุดพัก; -ตกลงบางครั้งเราอาจไม่ต้องการใช้สตริงเช่นแทรกหรืออัปเดตโดยตรงในการโต้ตอบเนื่องจากจำเป็นต้องมีข้อมูลจำเพาะการตั้งชื่อหลายครั้ง
ตัวอย่างเช่นกำหนดประเภทการกระทำของผู้ใช้:
1. บันทึกข้อมูลผู้ใช้
2. รับข้อมูลผู้ใช้พื้นฐานผ่าน ID
3. รับรายชื่อผู้ใช้
4. ลบข้อมูลผู้ใช้ผ่าน ID
เป็นต้น
เราอาจกำหนดการแจกแจงเป็น:
public enum useroptionenum {save_user, get_user_by_id, get_user_list, delete_user_by_id}อย่างไรก็ตามวิธีการของระบบและการกำหนดค่าคำหลักบางอย่างมักจะเขียนเป็น:
SaveUser, GetUserByid, GetUserByID, DELETEUSERBYID
แน่นอนว่าแต่ละคนมีกฎของตัวเอง แต่ถ้าคุณไม่ต้องการทำแผนที่ตรงกลางคุณก็ประนีประนอมกับมัน แทนที่ชื่อ enum ทั้งหมดซึ่งดูเหมือนค่อนข้างแปลกหรือแทนที่ชื่อวิธีทั้งหมดซึ่งแปลกยิ่งกว่าหรือคุณสามารถทำแผนที่ด้วยตัวเอง โอเคมันลำบากกว่าเล็กน้อย แต่จริงๆแล้วมันไม่ลำบากใช่ไหม
ก่อนอื่นเรามาเขียนวิธีการแปลงข้อมูลแบบขีดเส้นใต้ที่แจกแจงเป็นอูฐและวางไว้ใน stringutils:
สตริงคงที่สาธารณะ convertDbstyletojavastyle (สตริง dbstylestring, boolean firstupper) {dbstylestring = dbstylestring.toLowercase (); สตริง [] โทเค็น = dbstyLestring.split ("_"); StringBuilder StringBuilder = new StringBuilder (128); ความยาว int = 0; สำหรับ (โทเค็นสตริง: โทเค็น) {ถ้า (stringutils.isnotblank (โทเค็น)) {ถ้า (ความยาว == 0 &&! firstupper) {stringbuilder.append (โทเค็น); } else {char c = token.charat (0); if (c> = 'a' || c <= 'z') c = (char) (c - 32); StringBuilder.Append (C); StringBuilder.Append (token.substring (1)); }} ++ ความยาว; } return stringbuilder.toString (); -โอเวอร์โหลดวิธี:
สตริงคงที่สาธารณะ convertDbstyletojavalocalstyle (สตริง dbstylestring) {return convertdbstyletojavastyle (dbstylestring, false); -จากนั้นกำหนด enum:
public enum useroptionenum {save_user, get_user_by_id, get_user_list, delete_user_by_id; แผนที่คงที่ส่วนตัวสุดท้าย <String, useroptionenum> enum_map = ใหม่ hashmap <string, useroptionenum> (64); คงที่ {สำหรับ (useroptionenum v: ค่า ()) {enum_map.put (v.toString (), v); }} สาธารณะ StaticUserOptionEnum FromString (String V) {useroptionenum useroptionenum = enum_map.get (v); return useroptionenum == null? ค่าเริ่มต้น: useroptionenum; } public String toString () {string StringValue = super.toString (); return StringUtil.ConvertDbstyletojavalocalstyle (StringValue); -ตกลงผ่านพารามิเตอร์เหตุการณ์เช่นนี้เพื่อให้ถ้าเป็น: saveUser, ใช้:
String Event = "SaveUser"; // ถ้าคุณได้รับพารามิเตอร์ useroptionEnum enum = useroptionenum.fromstring (เหตุการณ์);
ในความเป็นจริงฉันทำแฮชแมปด้วยตัวเองและฉันเพิ่ม fronstring เพราะมีข้อ จำกัด บางประการเกี่ยวกับการแจงนับและวิธีการบางอย่างไม่อนุญาตให้คุณเขียนทับเช่นวิธีการของค่า
จริงๆแล้วไม่มีอะไรจะพูด มาพูดถึงการเพิ่มตัวแปรที่กำหนดเองให้กับ enums ในความเป็นจริงยกเว้นการเป็นซิงเกิลตัน enums อื่น ๆ คล้ายกับชั้นเรียนธรรมดา พวกเขายังสามารถมีวิธีการสร้าง แต่ไม่ใช่โดยค่าเริ่มต้น พวกเขายังสามารถให้ตัวแปรที่กำหนดเองจากนั้นรับ SET และ GET Methods อย่างไรก็ตามหากมีการตั้งค่าเธรดไม่ปลอดภัยดังนั้นให้ใส่ใจกับจุดนี้ ดังนั้นวิธีการก่อสร้างจึงเขียนโดยทั่วไป:
enum สาธารณะ sqltypeenum {แทรก ("แทรกเข้าไปใน"), ลบ ("ลบจาก") ...... ละเว้น; ชื่อสตริงส่วนตัว; // กำหนดตัวแปรที่กำหนดเอง Private SQLTypeenum (ชื่อสตริง) {this.name = name; } สตริงสาธารณะ getName () {ชื่อคืน; } public String toString () {return name + "i dash"; // rewrite วิธี toString} // โดยทั่วไปไม่แนะนำโมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; -เรียกว่า:
sqltypeenum sqltypeenum = sqltypeenum.valueof ("แทรก"); system.out.println (sqltypeenum); system.out.println (sqltypeenum.getName ());ไม่แนะนำให้เรียกว่า:
sqltypeenum.setName ("Damn");ในกระทู้อื่น:
sqltypeenum sqltypeenum = sqltypeenum.valueof ("แทรก"); system.out.println (sqltypeenum); system.out.println (sqltypeenum.getName ());ฉันพบว่าผลลัพธ์ที่ได้เปลี่ยนไปฮ่าฮ่า!