مفهوم
الاسم الكامل enum هو التعداد ، وهي ميزة جديدة تم تقديمها في JDK 1.5.
في Java ، فإن النوع المعدل بواسطة الكلمة الرئيسية enum هو نوع التعداد. النموذج كما يلي:
تعداد اللون {أحمر ، أخضر ، أزرق}إذا لم يضيف التعداد أي طريقة ، فإن قيمة التعداد الافتراضية إلى قيمة مرتبة تبدأ من 0
فوائد التعداد: يمكن تنظيم الثوابت وإدارتها بطريقة موحدة.
سيناريوهات التطبيق النموذجية للتعداد: رموز الخطأ ، آلات الحالة ، إلخ.
طبيعة أنواع التعداد
على الرغم من أن enum يبدو وكأنه نوع بيانات جديد ، في الواقع ، يعد ENUM فئة مقيدة وله طريقته الخاصة.
عند إنشاء التعداد ، سيقوم برنامج التحويل البرمجي بإنشاء فئة ذات صلة لك ، ورثت من java.lang.Enum .
java.lang.Enum إعلان فئة
تعداد الفئة التجريدية العامة <e يمتد التعداد <e >> الأدوات المماثلة <e> ، serializable {...}طرق التعداد
في التعداد ، يتم توفير بعض الطرق الأساسية:
values() : إرجاع مجموعة من مثيلات التعداد ، ويتم الحفاظ على العناصر في هذه الصفيف بصرامة بالترتيب الذي تم الإعلان عنه في التعداد.
name() : إرجاع اسم المثيل.
ordinal() : إرجاع الطلب عند إعلان المثيل ، بدءًا من 0.
getDeclaringClass() : إرجاع نوع التعداد الذي ينتمي إليه المثيل.
equals() : تحديد ما إذا كان هو نفس الكائن.
يمكنك استخدام == لمقارنة مثيلات enum .
بالإضافة إلى ذلك ، يقوم java.lang.Enum بتنفيذ الواجهات Comparable والقابلة Serializable ، وبالتالي يتم توفير طريقة المقارنة () أيضًا.
مثال: الطرق الأساسية لإظهار التعداد
الفئة العامة enummethoddemo {enum color {Red ، Green ، Blue ؛} size {big ، middle ، small ؛} main static void main (String args []) {system.out.println ================================================================= لـ (Color C: System.out.println ("================ طباعة كل الحجم ============================================== لـ (size s: size.values ()) color.green color.green: " + green.equals (color.green)) ؛ system.out.println (" Green Equals Size.Middle: " + Green.equals (size.middle)) ؛ system.out.println (" Green Equals 1: " + Green.equals (1)) ؛ }}الإخراج
==============تار getDeclaringclass (): الفئة org.zp.javase.enumeration.enumdemo $ colorgreen hashdo (): 460141958green colorto color.green: 0green يساوي اللون.
ميزات التعداد
يتم تلخيص خصائص التعداد في جملة واحدة:
بالإضافة إلى عدم قدرته على الوراثة ، يمكن اعتبار enum في الأساس فئة منتظمة.
ولكن يجب فهم هذه الجملة بشكل منفصل ، دعنا نشرح ذلك بالتفصيل.
يمكن أن يضيف التعداد طرقًا
في الفصل المفهوم ، تتخلف قيمة التعداد إلى قيمة مرتبة تبدأ من 0. ثم السؤال هو: كيفية تعيين القيم إلى التعداد المعروض.
لا تسمح Java باستخدام = تعيين القيم لتعداد الثوابت
إذا تعرضت لـ C/C ++ ، فسوف تفكر بالتأكيد في رمز المهمة = بشكل طبيعي. في لغة C/C ++ ، يمكن تعيين التعداد لتعداد الثوابت مع رمز المهمة = معروض ؛ ومع ذلك ، لسوء الحظ ، لا يُسمح برمز المهمة = المعين إلى ثوابت التعداد في بناء جملة Java.
مثال: إعلان التعداد في لغة C/C ++
Typedef enum {one = 1 ، اثنين ، ثلاثة = 3 ، عشرة = 10} ؛يمكن أن تضيف التعداد طرقًا عادية وطرق ثابتة وطرق تجريدية وطرق المنشئ.
على الرغم من أنه لا يمكن لـ Java تعيين قيم مباشرة إلى الحالات ، إلا أنه يحتوي على حل أفضل: إضافة طرق إلى تعداد لتنفيذ مهام العرض بشكل غير مباشر.
عند إنشاء enum ، يمكنك إضافة طرق متعددة لذلك ، وحتى البنائين.
ملاحظة واحدة التفاصيل: إذا كنت ترغب في تحديد طريقة لعضرة ، فيجب عليك إضافة فاصلة فاصلة في نهاية المثيل الأخير من التعداد. بالإضافة إلى ذلك ، في التعداد ، يجب تعريف المثيل أولاً ، ولا يمكن تحديد الحقول أو الأساليب قبل المثيل. خلاف ذلك ، سيقوم المترجم بالإبلاغ عن خطأ.
مثال: أظهر تمامًا كيفية تحديد الطرق العادية والطرق الساكنة والطرق التجريدية وطرق البناء في التعدادات
error errorcode {OK (0) {public string getDescription () {return "success" ؛ }} ، error_a (100) {public string getDescription () {return "error a" ؛ }} ، error_b (200) {public string getDescription () {return "error b" ؛ }} ؛ رمز int الخاص ؛ // مُنشئ: لا يمكن إعلان مُنشئ التعداد إلا كذنه خاص أو لا يعلن عن إذن errorcode (رقم int) {// constructor this.code = number ؛ } public int getCode () {// method method code ؛ } // طريقة عادية السلسلة الملخصية العامة getDescription () ؛ // method method public static void main (String args []) {// method static method for (errorcode s: errorcode.values ()) {system.out.println ("code:" + s.getCode () + "، description:" + s.getDescription ()) ؛ }}}ملاحظة: المثال أعلاه غير مستحسن ، فقط لإظهار أن التعداد يدعم تعريف الطرق المختلفة. هنا مثال مبسط
مثال: تعريف نوع تعداد رمز الخطأ
نتائج تنفيذ هذا المثال والمثال أعلاه هي نفسها بالضبط.
error errorcodeen {OK (0 ، "Success") ، error_a (100 ، "خطأ A") ، error_b (200 ، "error b") ؛ errorcodeen (رقم int ، وصف السلسلة) {this.code = number ؛ this.description = الوصف ؛ } رمز int الخاص ؛ وصف السلسلة الخاصة ؛ public int getCode () {return code ؛ } السلسلة العامة getDescription () {return description ؛ } main static void main (سلسلة args []) {// static method for (errorcodeen s: errorcodeen.values ()) {system.out.println ("code:" + s.getCode () + "، description:" + s.getDescription ()) ؛ }}}يمكن أن ينفذ التعداد واجهات
يمكن أن تنفذ enum واجهات مثل الفئات العامة.
كما أنه ينفذ فئة تعداد رمز الخطأ في القسم السابق. من خلال تنفيذ الواجهة ، يمكن أن تقيد أساليبها.
الواجهة العامة inumberenum {int getCode () ؛ سلسلة getDescription () ؛} error errorcodeen2 public erraments {ok (0 ، "success") ، error_a (100 ، "error a") ، error_b (200 ، "error b") ؛ errorcodeen2 (رقم int ، وصف السلسلة) {this.code = number ؛ this.description = الوصف ؛ } رمز int الخاص ؛ وصف السلسلة الخاصة ؛ Override public int getCode () {return code ؛ } Override public string getDescription () {return description ؛ }}لا يمكن أن يتم توريث التعداد
لا يمكن أن يرث التعداد فئة أخرى ، وبالطبع ، لا يمكن أن يرث التعداد الآخر.
نظرًا لأن enum الموروثة بالفعل من فئة java.lang.Enum ، ولا تدعم Java الميراث المتعدد ، ولا يمكن أن يرث التعداد فئات أخرى ، وبالطبع لا يمكن أن يرث enum الآخر.
سيناريوهات التطبيق المذكورة
تنظيم الثوابت
قبل JDK1.5 ، كان تعريف الثوابت في Java هو public static final TYPE a ؛ في هذا النموذج. مع التعدادات ، يمكنك تنظيم ثوابت الجمعيات لجعل الكود أكثر قابلية للقراءة وآمنة ، وكذلك استخدام الأساليب التي توفرها التعدادات.
تعداد تنسيق إعلان
ملاحظة: إذا لم تكن هناك طريقة محددة في التعداد ، فيمكنك أيضًا إضافة فاصلة أو فاصلة فاصلة أو لا شيء بعد الحالة الأخيرة.
أساليب الإعلان الثلاثة التالية متكافئة:
ENUM COLOR {Red ، Green ، Blue} Enum Color {Red ، Green ، Blue ،} enum Color {Red ، Green ، Blue ؛ }تبديل آلة الحالة
غالبًا ما نستخدم عبارات التبديل لكتابة آلات الحالة. بعد JDK7 ، يدعم Switch معلمات int、char、String、enum . بالمقارنة مع هذه الأنواع من المعلمات ، فإن رمز التبديل باستخدام التعدادات أكثر قابلية للقراءة.
enum إشارة {Red ، أصفر ، أخضر} سلسلة ثابتة عامة getTrafficInstruct (إشارة إشارة) {string instruct = "فشل ضوء الإشارة" ؛ التبديل (إشارة) {case red: instruct = "Red Light Stop" ؛ استراحة؛ الحالة الأصفر: addruct = "يرجى الانتباه إلى الضوء الأصفر" ؛ استراحة؛ Case Green: instruct = "Green Light Line" ؛ استراحة؛ الافتراضي: استراحة ؛ } addruct ؛}تنظيم التعداد
يمكن تنظيم تعدادات أنواع مماثلة من خلال واجهات أو فصول.
ومع ذلك ، يتم تنظيمه بشكل عام عن طريق الواجهة.
والسبب هو: ستضيف واجهة Java تلقائيًا معدل public static إلى نوع التعداد عند التجميع ؛ ستضيف فئة Java تلقائيًا تعديلًا static إلى نوع enum عند التجميع. هل رأيت الفرق؟ هذا صحيح ، أي تنظيم enum في الفصل. إذا لم تقم بتعديله إلى public ، فيمكنك الوصول إليها فقط في هذه الحزمة.
مثال: تنظيم التعدادات في الواجهات
نبات الواجهة العامة {enum vegetable تنفس inumberenum {potato (0 ، "potato") ، الطماطم (0 ، "Tomato") ؛ الخضار (رقم int ، وصف السلسلة) {this.code = number ؛ this.description = الوصف ؛ } رمز int الخاص ؛ وصف السلسلة الخاصة ؛ Override public int getCode () {return 0 ؛ } Override public string getDescription () {return null ؛ }} enum fruit refricments inumberenum {Apple (0 ، "Apple") ، Orange (0 ، "Orange") ، Banana (0 ، "Banana") ؛ الفاكهة (رقم int ، وصف السلسلة) {this.code = number ؛ this.description = الوصف ؛ } رمز int الخاص ؛ وصف السلسلة الخاصة ؛ Override public int getCode () {return 0 ؛ } Override public string getDescription () {return null ؛ }}}مثال: تنظيم التعدادات في الفصل
هذا المثال له نفس تأثير المثال السابق.
Public Class Plant2 {public enum Vegetable Passion inumberenum {...} // حذف الكود التعداد العام للفاكهة الأدوات inumberenum {...} // حذف الكود}تعداد الاستراتيجية
يظهر تعداد الاستراتيجية في Java الفعالة. هذا التعداد يصنف ثوابت التعداد عن طريق التعداد المتداخل.
على الرغم من أن هذا النهج ليس موجودًا مثل بيان التبديل ، إلا أنه أكثر أمانًا وأكثر مرونة.
مثال: مثال على تعداد السياسة في effectviejava
enum payrollday {monday (paytype.weekday) ، الثلاثاء (paytype.weekday) ، الأربعاء (paytype.weekday) ، الخميس (paytype.weekday) ، الجمعة (paytype.weekday) ، السبت (paytype.weekend) ، الأحد (paytype.weekend) ؛ paytype النهائي الخاص ؛ payrollday (paytype paytype) {this.paytype = paytype ؛ } الدفع المزدوج (مرور ساعة مزدوجة ، رواتب مزدوجة) {return paytype.pay (hoursworked ، payrate) ؛ } // السياسة التعويضية الخاصة enum paytype {weekday {double overtimepay (ساعات مزدوجة ، payrate مزدوجة) {ساعات الإرجاع <= HOURS_PER_SHIFT؟ 0: (ساعات - ساعات_بير_ها) * Payrate / 2 ؛ }} ، عطلة نهاية الأسبوع {double overtimepay (ساعات مزدوجة ، رواتب مزدوجة) {ساعات الإرجاع * payrate / 2 ؛ }} ؛ private static final int hours_per_shift = 8 ؛ مجردة مزدوجة OvertimePay (ساعة مزدوجة ، رواتب مزدوجة) ؛ دفع مزدوج (مزدوج ساعة ، رواتب مزدوجة) {double basepay = hoursworked * payrate ؛ Return 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)) ؛تعداد و enummap
توفر Java فئتين للأدوات المريحة لتشغيل التعداد - Enumset و Enummap.
EnumSet هو تطبيق Set عالية الأداء لأنواع التعداد. يتطلب الأمر أن تنتمي ثوابت التعداد الموضوعة فيه إلى نفس نوع التعداد.
EnumMap هو تطبيق خريطة مصمم خصيصًا لأنواع التعداد. على الرغم من أن استخدام تطبيقات Map الأخرى (مثل hashMAP) يمكن أن يكمل أيضًا مثيلات نوع التعداد لتخطيط القيمة ، إلا أن استخدام ENUMMAP أكثر كفاءة: يمكن أن يتلقى فقط مثيلات من نفس نوع التعداد مثل القيم الرئيسية ، ولأن عدد مثيلات نوع التعداد ثابت نسبيًا ويحدود ، يستخدم Enummap مجموعة لتخزين القيم المقابلة لنوع التعداد. هذا يجعل Enummap فعالة للغاية.
// استخدام نظام التعداد. لـ (errorcodeen e: errset) {system.out.println ( enummap (statemachine.signal.class) ؛ errmap.put (statemachine.signal.red ، "الضوء الأحمر") ؛ errmap.put (statemachine.signal.yellow ، "yellow") ؛ errmap.put (statemachine.signal.green ، "green light") errmap.EntrySet (). iterator () ؛ system.out.println (entrate.getKey (). name () + ":" + entry.getValue ()) ؛}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.