JavaRush /مدونة جافا /Random-AR /التعدادات في جافا (تعداد جافا)
articles
مستوى

التعدادات في جافا (تعداد جافا)

نشرت في المجموعة
عند البرمجة، غالبًا ما نواجه الحاجة إلى تحديد مجموعة القيم الصالحة لنوع معين من البيانات. لذلك، على سبيل المثال، يمكن أن يحتوي يوم الأسبوع على 7 قيم مختلفة، ويمكن أن يحتوي شهر السنة على 12، ويمكن أن يحتوي الموسم على 4. ولحل مثل هذه المشكلات، توفر العديد من لغات البرمجة المكتوبة بشكل ثابت نوع بيانات خاصًا - التعداد ( enum). لم يظهر التعداد في Java على الفور. تم تقديم بنية لغة متخصصة enumبدءًا من الإصدار 1.5. حتى هذه اللحظة، استخدم المبرمجون طرقًا أخرى لتنفيذ التعدادات. التعدادات في جافا (تعداد جافا) - 1

بناء التعداد

لنبدأ بمثال. دعنا نصف enumنوع البيانات لتخزين الموسم باستخدام:
enum Season { WINTER, SPRING, SUMMER, AUTUMN }
حسنًا، مثال بسيط على استخدامه:
Season season = Season.SPRING;
if (season == Season.SPRING) season = Season.SUMMER;
System.out.println(season);
ونتيجة لذلك سيتم طباعة SUMMER على وحدة التحكم . أعتقد أن المثال واضح ولا يحتاج إلى شرح.

التعداد هو فئة

من خلال الإعلان enum، نقوم ضمنيًا بإنشاء فئة مشتقة من java.lang.Enum. تقليديا، البناء enum Season { ... }يعادل class Season extends java.lang.Enum { ... }. وعلى الرغم من أن المترجم لا يسمح لنا بوراثة منا بشكل صريح java.lang.Enum، إلا أنه لا يزال من السهل التحقق من enumتوريثه باستخدام reflection:
System.out.println(Season.class.getSuperclass());
سيتم عرض ما يلي على وحدة التحكم:
class java.lang.Enum
يتم تنفيذ الميراث الفعلي تلقائيًا لنا بواسطة مترجم Java. بعد ذلك، دعونا نتفق على استدعاء الفئة التي أنشأها المترجم لتنفيذ التعداد بـ enum-class، والقيم المحتملة للنوع المذكور enumكعناصر -a.

أعضاء التعداد هم مثيلات enumلفئة يمكن الوصول إليها بشكل ثابت

العناصر enum Season (WINTER, SPRING и т.д.)هي مثيلات يمكن الوصول إليها بشكل ثابت enumمن -class Season. يتيح لنا توفرها الثابت إجراء مقارنات باستخدام عامل المقارنة المرجعي ==. مثال:
Season season = Season.SUMMER;
if (season == Season.AUTUMN) season = Season.WINTER;

الاسم والرقم التسلسلي لعنصر التعداد

كما ذكرنا سابقًا، فإن Any enum-class يرث java.lang.Enum، والذي يحتوي على عدد من التوابع المفيدة لجميع التعدادات. مثال:
Season season = Season.WINTER;
System.out.println("season.name()=" + season.name() + " season.toString()=" + season.toString() + " season.ordinal()=" + season.ordinal());
سيكون الإخراج:
season.name()=WINTER season.toString()=WINTER season.ordinal()=0
الأساليب name()، toString()وتظهر هنا ordinal(). دلالات الأساليب واضحة. تجدر الإشارة إلى أن هذه الأساليب enumموروثة من الفصل java.lang.Enum. الحصول على عنصر enumمن خلال تمثيل السلسلة لاسمه في كثير من الأحيان تنشأ مهمة الحصول على عنصر enumمن خلال تمثيل السلسلة الخاصة به. لهذه الأغراض، في كل enumفئة، يقوم المترجم تلقائيًا بإنشاء طريقة ثابتة خاصة: public static EnumClass valueOf(String name)والتي تقوم بإرجاع عنصر التعداد EnumClassباسم يساوي name. مثال الاستخدام:
String name = "WINTER";
Season season = Season.valueOf(name);
نتيجة لتنفيذ الكود، سيكون متغير الموسم مساويًا لـ Season.WINTER. يرجى ملاحظة أنه إذا لم يتم العثور على العنصر، فسيتم طرح IllegalArgumentException ، وإذا كان nameمتساويًا null، فسيتم طرح NullPointerException . بالمناسبة، غالبا ما يتم نسيان هذا. لسبب ما، كثيرون مقتنعون تمامًا أنه إذا أخذت دالة وسيطة واحدة وفي ظل ظروف معينة قامت بإلقاء IllegalArgumentException ، فعند تمريرها إلى هناك ، سيتم بالتأكيد طرح IllegalArgumentExceptionnull أيضًا . ولكن هذا خارج عن الموضوع. فلنكمل. الحصول على كافة عناصر التعداد في بعض الأحيان تحتاج إلى الحصول على قائمة بجميع عناصر -class في وقت التشغيل. لهذه الأغراض، يقوم المترجم بإنشاء طريقة في كل -class . مثال الاستخدام: enumenumpublic static EnumClass[] values()
System.out.println(Arrays.toString(Season.values()));
نحصل على الإخراج التالي:
[WINTER, SPRING, SUMMER, AUTUMN]
لاحظ أنه لم يتم تعريف أي طريقة valueOf()ولا طريقة values()في الفصل java.lang.Enum. بدلاً من ذلك، يتم إضافتها تلقائيًا بواسطة المترجم عند enumتجميع الفئة. إضافة أساليبك الخاصة إلى enum-class لديك الفرصة لإضافة أساليبك الخاصة إلى كل من enum-class وعناصره: التعدادات في جافا (تعداد جافا) - 2نفس الشيء، ولكن مع تعدد الأشكال: التعدادات في جافا (تعداد جافا) - 3يوضح المثال الأخير استخدام الميراث في enum. المزيد عن هذا لاحقا. يسمح لك الوراثةenum في Java enumبتنفيذ تسلسل هرمي للفئة، حيث يتم إنشاء كائناتها في مثيل واحد ويمكن الوصول إليها بشكل ثابت. في هذه الحالة، enumيمكن أن تحتوي العناصر على مُنشئاتها الخاصة. لنعطي مثالا: التعدادات في جافا (تعداد جافا) - 4هنا نعلن عن تعداد بثلاثة Typeعناصر INTو INTEGER. STRINGسيقوم المترجم بإنشاء الفئات والكائنات التالية:
  • Type- فئة مشتقة منjava.lang.Enum
  • INT- كائن من الدرجة الأولى مشتق منType
  • INTEGER- كائن من الدرجة الثانية مشتق منType
  • STRING- كائن من الدرجة الثالثة مشتق منType
سيتم إنشاء ثلاث فئات مشتقة باستخدام طريقة متعددة الأشكال Object parse(String)ومنشئ Type(..., boolean). INTفي الوقت نفسه ، INTEGERتوجد كائنات الفئات STRINGفي نسخة واحدة ويمكن الوصول إليها بشكل ثابت. يمكنك التحقق من ذلك:
System.out.println(Type.class);
System.out.println(Type.INT.getClass() + " " + Type.INT.getClass().getSuperclass());
System.out.println(Type.INTEGER.getClass() + " " + Type.INTEGER.getClass().getSuperclass());
System.out.println(Type.STRING.getClass()  + " " + Type.STRING.getClass().getSuperclass());
نحصل على الإخراج التالي:
class Type
class Type$1 class Type
class Type$2 class Type
class Type$3 class Type
يمكن ملاحظة أن المترجم أنشأ فئة Typeو 3 nestedفئات مشتقة من Type.

فئة التعداد المنفصلة مع الميراث

ولتأكيد ما سبق نقدم أيضاً نتيجة فك التعداد Typeمن المثال أعلاه: التعدادات في جافا (تعداد جافا) - 5

التعدادات وتعدد الأشكال البارامترية

قد يتساءل القارئ: " لماذا لا يستخدم تعداد النوع أعلاه الأسماء العامة؟ " الحقيقة هي أن استخدام الأدوية الجنيسة enumمحظور في Java. لذلك لن يتم تجميع المثال التالي:
enum Type<T> {}

المزيد من الدراسة

لفهم أعمق لكيفية عمل التعدادات في Java، أوصي بالتعرف على الكود المصدري للفئة java.lang.Enum، وكذلك استخدام برنامج Jad decompiler لدراسة الكود الذي تم إنشاؤه. علاوة على ذلك، فإن دراسة الكود المصدري لمكتبة Java أمر ضروري للغاية لفهم عدد الآليات التي تعمل في Java وهي مفيدة كمرجع للتصميم الموجه للكائنات. رابط المصدر الأصلي: http://alexander.lds.lg.ua/
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION