حول التعداد
يتم إعطاء معظم التعدادات المكتوبة في الأماكن التعداد ثم يبدأ المثال في التبديل. لكنني أود أن أقول إن البيانات من الكود الخاص بي من غير المرجح أن تكون التعداد ، وعادة ما تكون الأوتار أو الأرقام. على سبيل المثال ، بعد تحليل SQL ، حددت أولاً نوع SQL. من خلال اعتراض رمز SQL ، يمكن تحديد التقاطع أو حذف أو تحديث أو إدراج أو تغيير ، إلخ ، لكنهم كلهم سلاسل. في هذا الوقت ، أريد استخدام التعداد ، لكن لا يمكنني فعل ذلك. كيفية تحويل السلسلة إلى تعداد؟ تشمل المواقف المماثلة أخذ بيانات من قاعدة البيانات وإصدار الأحكام بناءً على بعض الأنواع ، وتمرير البيانات من الصفحة ، والقيام بعمليات مختلفة وفقًا لأنواع مختلفة ، لكنها كلها سلاسل ، وليس التعدادات. المأساة هي أنني نادراً ما أرى أي شخص يكتب هذا الشيء ؛ لذلك كتبت ذلك ، على أمل أن يتمكن شخص ما من استخدامه.
بادئ ذي بدء ، لماذا استخدام التعداد؟ متى من الأفضل استخدام التعداد؟ ما هي مزايا استخدام التعداد؟
أعتقد أنه عندما تكون في بعض فصول الفئات ويمكنك تعداد الأنواع غير المتغيرة لتوجيه البرنامج لتوجيه إلى أماكن مختلفة ، فإن استخدام التعداد هو خيار أفضل ؛
يبدو الأمر مربكًا بعض الشيء ، ولكن هناك مثال قد يتم فهمه ، على سبيل المثال:
يمكننا سرد الأشياء التي نقوم بها في أيام عملنا اليومية:
اذهب إلى العمل ، أو عقد اجتماعات ، وتناول الطعام ، والنوم ، إلخ.
يمكننا سرد الأجزاء التي تحتاج إلى فحصها من قبل قسم الأنف والحنجرة في المستشفى:
العيون ، الأنف ، الأذنين ، الفم ، إلخ.
يمكن تعدادها ، وعلينا أن نفعل كل منهم بطريقة مختلفة ؛
بالطبع يمكنك أن تقول:
1. يمكن إرساله ديناميكيًا من خلال ملفات التكوين أو التعليق التوضيحي ؛
2. يمكن استخدام الثوابت لتحقيق آثار مماثلة.
3. التعبير عنها مباشرة من خلال متساوية من السلسلة ، والتعبير عنها إذا كانت أخرى
إذا كنت تستخدم طريقة إضافة التكوين لإرسالها ، فهي مرنة وسهلة التعديل ؛ ولكن إذا استخدمنا العديد من المعلمات التي لم يتم تعديلها بشكل متكرر ، فغالبًا ما نزيد من عبء التكوين ، وعندما تحتاج إلى قراءة منطق النظام ، تحتاج إلى قراءة التكوين والرمز مرة أخرى ؛ ومع ذلك ، إذا كانت المعلمات هي معلومات قابلة للتحويل ديناميكيًا ، فإن استخدام التكوين هو الخيار الصحيح ؛
عادةً ما يكون استخدام الثوابت أرقامًا عند تبديل الحالات ، ولا يمكن أن تكون السلاسل تبديل الحالات في Java. الغرض من استخدام الثوابت يزيد من قابلية القراءة من الحالة 1 والحالة 2 ... ولكن بيانات السلسلة مزعجة أيضًا. ما لم يتم تعيينه مرة أخرى ، ليست هناك حاجة. في الواقع ، يتم تعيين التعداد تقريبًا لك مرة واحدة ، لكنه يلف الرمز. لأنه تم القيام به ودعمه بشكل نحلي ، لماذا لا تستخدمه! ثانياً ، على الرغم من أن الثوابت تزيد من قابلية القراءة ، إلا أنها لا تملك مفهوم الفئات وأنواع الإدارة. وهذا يعني أن تعريف التعداد يحدد فئة ، والتي يمكن أن تدرج الأشياء اللازمة لهذا النطاق بشكل جيد. عادة ما تكون الثوابت بعض التجمعات المحددة من تلقاء نفسها ، ووضعها في بعض الطبقات العامة أو المحددة بشكل عشوائي ، وهي منتشرة نسبيًا. بالإضافة إلى ذلك ، يتم تعريف التعداد بوضوح عند التبديل ، والحالة تكون في نطاق تعداد القفل. لا يمكنه التحكم في النظام فحسب ، وزيادة قابلية القراءة ، ولكن أيضًا التحقق من المعلومات في هذه الفئة هي في أي وقت ، وذلك لتحقيق وظيفة النظر في ملفات التكوين ؛ لكنه لا يزال يعود في تلك الجملة ، إذا كانت المعلمات متغيرة ، فهي ليست مناسبة للتعداد. يجب أن تكون التعدادات قابلة للتعداد ، أو يمكن تعداد اعتبارات النظام الحالية. على سبيل المثال ، قد يكون هناك العديد من المستشفيات في المستشفى أعلاه ، لكن المستشفى الحالي يعالج فقط بعض الأجزاء ولا يعالج الآخرين. هذا هو السبب. ما هو المتغير؟ على سبيل المثال ، يتم إرسال معلمات URL إلى الطريقة المقابلة. من المستحيل على الجميع إضافة قطعة من المنطق وإضافة العداد وحالة. في هذا الوقت ، من الأفضل استخدام [Configuration + Method Method Dispatch]. بالطبع ، يمكن أن يكون التكوين مجرد ملف أو تعليق توضيحي.
الشيء الأكثر ريفية هو استخدام السلسلة المتساوية لتنفيذها إذا كان آخر. هاها ، لا حرج في هذا ، ولكن هذا مكتوب بطريقة مبعثرة. ثانياً ، يجب مقارنة كل مطابقة مساوية لكل حرف في كل مرة تتطابق فيها مع المساواة. إذا قمت بحلق الكثير في التعليمات البرمجية الخاصة بك ، فإن الأداء ليس جيدًا جدًا ، وسيكون الباقي أكثر وضوحًا بعد النظر إلى الوصف أعلاه ؛
ثانياً ، يوفر التعداد مكونًا لإدارة النوع ، مما يجعل النظام الموجهة نحو الكائن أكثر مثالية ، بحيث يمكن تكوين وإدارة بعض أنواع الإدارة. عند استخدام التعداد ، يمكنك العثور على تعريف التعداد الذي تمت معالجته ولم تتم معالجته ، وما سبق يصعب تحقيقه ؛ على سبيل المثال ، هناك 10 أنواع من أنواع العمليات المحددة في قواعد البيانات ، لذلك في عملية تحديد ، يمكن النظر إلى التعداد كملف تكوين ، وهو سهل للغاية لإدارته.
أخيرًا ، يعد التعداد المفرد تمامًا ، وأداء المقارنة مماثل لأداء الأداء الرقمي ، والذي يمكن أن يحصل على قابلية القراءة والأداء.
الاستخدام الأساسي لنوع التعداد
مع هذا الأساس النظري ، دعونا نلقي نظرة على أنواع التعداد في Java:
1. يمكنك إضافة متغيرات وطرق للتعداد
دعنا نلقي نظرة على مثال رمز:
حالة التعداد العام {normal ("normal" ، 1) ، update ("updated" ، 2) ، deleted ("deleted" ، 3) ، apped ("Masked" ، 4) ؛ // عضو متغير السلسلة الخاصة ؛ مؤشر int الخاص ؛ // طريقة البناء ، ملاحظة: لا يمكن أن يكون المُنشئ علنيًا ، لأنه لا يمكن إنشاء تعداد الحالة الخاصة (اسم السلسلة ، int index) {this.name = name ؛ this.index = فهرس ؛ }. }} الإرجاع null ؛ } // Get Set method method string getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } public int getIndex () {return index ؛ } public void setIndex (int index) {this.index = index ؛ }}من الكود أعلاه ، يمكننا أن نرى أنه بعد تحديد قيمة التعداد ، ثم إضافة فاصلة فاصلة إليها ، ثم يمكنك تحديد المتغيرات والأساليب الأخرى. تجدر الإشارة على وجه الخصوص إلى أنه لا يمكن تحديد طريقة البناء في التعداد من قبل الجمهور ، لذلك يتم ذلك لمنع المستخدم من إنشاء التعداد.
2. يمكن استخدامها لتحديد الثوابت
دعنا أولاً نراجع كيفية تحديد الثوابت في جافا ، ونرى الكود التالي:
الثابت العام int int normalstate = 1 ؛ updatestate النهائي الثابت الخاص = 2 ؛
أدناه يمكننا أيضًا استخدام Enum Enum لاستبدال التعريف الثابت أعلاه ، الرمز هو كما يلي:
حالة التعداد العام {العادي ، التحديث ، المحذوف ، تم إطلاقها}لا توجد ميزة بناء الجملة في استخدام التعداد لتحديد الثوابت في Java ، ولكن يمكن أن يوفر نوع التعداد التعداد المزيد من الوظائف التشغيلية.
3. تنفيذ الواجهة في التعداد
دعونا أولاً نلقي نظرة على الكود التالي:
الواجهة العامة icanReadState {void read () ؛ سلسلة getState () ؛} تعداد الحالة العامة تنفذ ICANReadState {Normal ("Normal" ، 1) ، update ("updated" ، 2) ، deleted ("deleted" ، 3) ، apped ("Masked" ، 4) ؛ اسم السلسلة الخاصة ؛ مؤشر int الخاص ؛ الحالة الخاصة (اسم السلسلة ، int index) {this.name = name ؛ this.index = فهرس ؛ } // طريقة الواجهة 1 Override public string getState () {return this.name ؛ } // طريقة الواجهة 2 Override public void read () {system.out.println (this.index + ":" + this.name) ؛ }}تمامًا مثل استخدام الواجهات في الفئات العامة ، يمكن لـ ENUM ENUM أيضًا أن يرث الواجهة وتنفيذ جميع الطرق في الواجهة. ميزة ذلك هي أنه يمكن أن يؤدي إلى فرز العمليات والمقارنة والعمليات الأخرى على القيم في التعداد بشكل أكثر ملاءمة ، ولديها تغليف أفضل.
مثال
دعونا أولاً نحدد التعداد البسيط (إليك مجرد مثال ، لذلك سنحدد ببساطة 3 متغيرات):
التعداد العام sqltypeenum {insert ، update ، delete ، select}بعد تحليل SQL ، يتم الحصول على رمز. كيف نحصل على تعداد هذا الرمز المميز؟
احصل عليه مثل هذا:
token token = "select" ؛ sqltypeenum sqltypeenum = sqltypeenum.valueof (token.touppercase ()) ؛
إذا لم يتم الحصول عليها ، ستقوم Java بإلقاء استثناء: UnalialArgumentException لا يوجد enum const class sqltypeenum.xxx
السبب في قيامني بالرحمة هو أن التعدادات رسمية أيضًا (بالطبع ، إذا كان التعداد الخاص بك صغيرًا ، فأنت صغير ، لكن من المثير للقلق خلطه). في الواقع ، تستدعي ValueOF رسم الخرائط الأساسية للعنونة:
سيتم استدعاء هذه الطريقة عند الاتصال:
لذلك هناك أيضا hashmap في الداخل ، هاها!
بعد الحصول على هذه المعلومات ، يمكنك القيام بالعملية المطلوبة:
Switch (sqltypeenum) {case insert: Handle Insert Logic ؛ استراحة؛ حذف الحالة: معالجة الحذف المنطق ؛ استراحة؛ ....}حسنًا ، قد لا نرغب في بعض الأحيان في استخدام سلاسل مثل إدراج أو تحديث مباشرة في التفاعل ، لأن مواصفات التسمية في كثير من الأحيان مطلوبة ؛
على سبيل المثال ، حدد بعض أنواع إجراءات المستخدم:
1. حفظ معلومات المستخدم
2. الحصول على معلومات المستخدم الأساسية من خلال المعرف
3. احصل على قائمة المستخدمين
4. حذف معلومات المستخدم من خلال المعرف
إلخ.
قد نحدد التعدادات على النحو التالي:
التعداد العام useroptionenum {save_user ، get_user_by_id ، get_user_list ، delete_user_by_id}ومع ذلك ، عادة ما تتم كتابة طرق النظام وبعض تكوينات الكلمات الرئيسية على النحو التالي:
SaveUser ، getuserbyid ، getuserbyid ، deleteuserbyid
بالطبع ، لكل منهما قواعده الخاصة ، ولكن إذا كنت لا ترغب في القيام بالرسم البياني في الوسط ، فأنت تتنازل عنه فقط. إما استبدال جميع أسماء التعداد ، والتي تبدو غريبة للغاية ، أو استبدال جميع أسماء الأسلوب ، والتي هي أكثر غرابة ، أو يمكنك القيام برسم الخرائط بنفسك. حسنًا ، إنه أمر مزعج قليلاً ، لكنه في الواقع ليس مزعجًا؟
دعنا أولاً نكتب طريقة لتحويل بيانات على غرار السطح الموضعي إلى الجمال ووضعها في سلسلة:
السلسلة الثابتة العامة convertDBStyletojavastyle (سلسلة dbstylestring ، boolean firstupper) {dbStylestring = dbStylestring.toLowerCase () ؛ String [] Tokens = dbStylestring.split ("_") ؛ StringBuilder StringBuilder = new StringBuilder (128) ؛ طول int = 0 ؛ من أجل (TRING TOKEN: TOKENS) {if (stringUtils.isNotBlank (token)) {if (length == 0 &&! firstupper) {StringBuilder.Append (token) ؛ } آخر {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) ؛ }ثم حدد التعداد:
التعداد العام userOptionEnum {save_user ، get_user_by_id ، get_user_list ، delete_user_by_id ؛ الخريطة الثابتة النهائية الخاصة <string ، userOptionEnum> enum_map = new hashmap <string ، userOptionEnum> (64) ؛ static {for (userOptionEnum v: dorder ()) {enum_map.put (v.toString () ، v) ؛ }} staticUserOptionenum public fromString (string v) {userOptionEnum userOptionEnum = enum_map.get (v) ؛ إرجاع userOptionEnum == NULL؟ الافتراضي: useroptionenum ؛ } السلسلة العامة toString () {String stringValue = super.toString () ؛ إرجاع stringutil.convertdbstyletojavalocalstyle (StringValue) ؛ }}حسنًا ، تمرير معلمة حدث مثل هذا بحيث إذا كان: SaveUser ، استخدم:
string event = "SaveUser" ؛ // إذا حصلت على المعلمة userOptionEnum enum = userOptionEnum.fromString (event) ؛
في الواقع ، لقد صنعت Hashmap بنفسي ، وأضفت من محرك لأن هناك بعض القيود على التعداد وبعض الأساليب لا تسمح لك بالكتابة فوقها ، مثل طريقة ValueOF.
في الواقع ، لا يوجد شيء ليقوله. دعنا نتحدث عن إضافة بعض المتغيرات المخصصة إلى التعداد. في الواقع ، باستثناء كونه مفردة ، فإن التعدادات الأخرى تشبه الطبقات العادية. يمكن أن يكون لديهم أيضًا طرق مُنشأة ، ولكن ليس بشكل افتراضي. يمكنهم أيضًا توفير متغيرات مخصصة ثم الحصول على مجموعة والحصول على الطرق. ومع ذلك ، إذا كان هناك مجموعة ، فإن الموضوع غير آمن ، لذا انتبه إلى هذه النقطة ؛ لذا فإن طريقة البناء مكتوبة بشكل عام:
التعداد العام sqltypeenum {insert ("insert in") ، حذف ("حذف من") ...... تم حذفه ؛ اسم السلسلة الخاص ؛ // تحديد متغير مخصص sqltypeenum (اسم السلسلة) {this.name = name ؛ } السلسلة العامة getName () {return name ؛ } السلسلة العامة toString () {return name + "i dash" ؛ // أعد كتابة طريقة toString} // بشكل عام غير موصى بها setName public void (اسم السلسلة) {this.name = name ؛ }}مُسَمًّى:
sqltypeenum sqltypeenum = sqltypeenum.valueof ("insert") ؛ system.out.println (sqltypeenum) ؛ system.out.println (sqltypeenum.getName ()) ؛لا ينصح بالاتصال به:
sqltypeenum.setName ("اللعنة") ؛في موضوع آخر:
sqltypeenum sqltypeenum = sqltypeenum.valueof ("insert") ؛ system.out.println (sqltypeenum) ؛ system.out.println (sqltypeenum.getName ()) ؛لقد وجدت أن النتيجة قد تغيرت ، هاها!