JavaRush /مدونة جافا /Random-AR /15 سؤالًا لمقابلة المطورين بخصوص Enum في Java (مع الإجابا...
Treefeed
مستوى

15 سؤالًا لمقابلة المطورين بخصوص Enum في Java (مع الإجابات!)

نشرت في المجموعة
تم تقديم التعداد ( Enum ) في Java 5 ومنذ ذلك الحين أصبح شائعًا جدًا بين مطوري Java. ويستخدم على نطاق واسع في تطبيقات جافا المختلفة. نظرًا لأن Enum في Java أكثر تنوعًا من C أو C++، فإنه يقدم أيضًا العديد من حالات الاستخدام المثيرة للاهتمام، والتي شاهدت اثنين منها في المقالة 10 طرق لاستخدام Enum في Java . ولكن على الرغم من هذه الشعبية، لا يزال العديد من مبرمجي Java غير مدركين للوظائف التي يوفرها Enum وتعقيدات استخدام Enum في تعليمات Java البرمجية. أصبح هذا واضحًا من العديد من القراء الذين سألوا، على سبيل المثال، عن قدرة Enum على تنفيذ واجهة في Java أو لماذا لا يمكننا إنشاء مثيل Enums خارج Enum ، مشيرين إلى أنه تم سؤالهم عن ذلك في مقابلة. لقد ألهمنا هذا بتجميع قائمة بالأسئلة المتداولة في Java Enum والتي لا تساعدك فقط على النجاح في المقابلات، ولكنها تفتح أيضًا طرقًا جديدة للتعلم. كما ذكرنا من قبل، غالبًا ما تجبرك أسئلة المقابلة على أخذ الموضوع على محمل الجد، وهذا ليس بالأمر السيئ، ونظرًا لقوة Enum وفائدته، فقد حان الوقت لأن تصبح أستاذًا في Enum. فيما يلي قائمة بالأسئلة المستندة إلى وظائف وخصائص Enum المتنوعة. يمكنك استخدامه كمادة تحضيرية للمقابلة أو مجرد دليل للتعداد. إذا كنت جديدًا في استخدام Java، فسوف تتعلم الكثير من الأشياء الجديدة والمفيدة حول Enum. 1) هل يستطيع Enum تنفيذ واجهة في Java؟ نعم، يمكن لـ Enum أن يرث الواجهات . نظرًا لأن نوع Enum يشبه فئة وواجهة ، فيمكنه أن يرث واجهة. وهذا يعطي مرونة مذهلة في استخدام Enum كتطبيق مخصص في بعض الحالات. فيما يلي مثال جيد لاستخدام Enum بهذه الصفة. 2) هل يمكن لـ Enum أن يرث (يمتد) الفصل؟ لا، هو لا يستطيع! غير متوقع، حيث قيل سابقًا أن نوع Enum يشبه فئة أو واجهة في Java. حسنًا، هذا هو السبب الرئيسي وراء طرح هذا السؤال مباشرة بعد السؤال السابق. بما أن Enum يرث بالفعل من الفئة المجردة java.lang.Enum ، فمن الواضح أن فئة أخرى لن تكون قادرة على الوراثة لأن Java لا تدعم وراثة الفئات المتعددة. من خلال الوراثة من java.lang.Enum ، تحتوي جميع التعدادات على أساليب ordinal() أو قيم() أو valueOf() . 3) كيفية إنشاء التعداد بدون مثيلات الكائن؟ هل هذا ممكن بدون خطأ في التجميع؟ هذا أحد الأسئلة الصعبة التي يحبها القائمون على إجراء المقابلات. نظرًا لأنه يُنظر إلى التعداد على أنه مجموعة من عدد معين من الكائنات، مثل أيام الأسبوع أو أشهر السنة، فإن الحصول على التعداد بدون أي شيء يبدو أمرًا مريبًا. لكن نعم، يمكنك إنشاء Enum بدون مثيلات ، على سبيل المثال عن طريق إنشاء فئة فائدة. هذه طريقة مبتكرة أخرى لاستخدام Enum: public enum MessageUtil{ ; // required to avoid compiler error, also signifies no instance public static boolean isValid() { throw new UnsupportedOperationException("Not supported yet."); } } 4) هل يمكننا تجاوز طريقة toString() لـ Enum؟ ماذا سيحدث إذا لم نعيد التعريف؟ بالطبع يمكنك تجاوز طريقة toString() الخاصة بـ Enum ، كما يمكنك تجاوز أي فئة ترث java.lang.Object ولديها طريقة toString() متاحة، وحتى إذا لم تفعل ذلك، فلن تفقد أي شيء لأن الملخص قاعدة فئة Enum ستقوم بذلك نيابةً عنك، وستعيد الاسم، وهو اسم مثيل Enum. فيما يلي رمز طريقة toString() من فئة Enum: يتم تحديد public String toString() { return name; } الاسم عندما يخصص المترجم التعليمات البرمجية لإنشاء تعداد استجابة لإنشاء مثيل في فئة Enum نفسها، بالإضافة إلى إنشاء ترتيبي في المُنشئ من فئة Enum. فئة java.lang.Enum : protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } هذا هو المنشئ الوحيد لإنشاء enum ، والذي يستدعيه المترجم استجابة لإعلان Enum في البرنامج. 5) هل يمكننا إنشاء مثيل للتعداد خارج التعداد؟ ولم لا؟ لا يمكنك إنشاء مثيل لـ Enum خارج حدود Enum لأن Enum لا يحتوي على عامالمُنشئ، ولن يسمح لك المترجم بتقديم أي مُنشئ من هذا القبيل. نظرًا لأن المترجم ينشئ معظم التعليمات البرمجية استجابةً لإعلان نوع Enum، فإنه لا يسمح بالمنشئات العامة داخل Enums، مما يفرض إعلان مثيلات Enum داخليًا. 6) هل يمكننا تحديد مُنشئ داخل التعداد؟ غالبًا ما يتبع هذا السؤال السؤال السابق. نعم، يمكنك ذلك، لكن تذكر أن هذا ممكن فقط مع المنشئين الخاصين أو المنشئين للحزمة الخاصة . لا يُسمح بالمنشئين العامين والمحميين في Enum . هنا يمكنك رؤية مثال . 7) ما الفرق بين مقارنة التعداد باستخدام طريقة == أو يساوي ()؟ هذه مسألة واسعة جدًا وصعبة ويتم تناولها بالتفصيل هنا . 8) ماذا تفعل الطريقة الترتيبية () في Enum؟ يُرجع الأسلوب الترتيبي () الترتيب الذي يتم به تعيين مثيلات Enum داخل Enum. على سبيل المثال، في DayOfWeek Enum، يمكنك تحديد الأيام بالترتيب: public enum DayOfWeek{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } وإذا قمنا باستدعاء الأسلوب DayOfWeek.MONDAY.ordinal() ، فسوف يُرجع 0 - وهو ما يعني المثيل الأول. هذه الطريقة مفيدة جدًا لتوفير الترتيب وفقًا للحالة الفعلية للأشياء: أي الإشارة إلى أن يوم الثلاثاء (الثلاثاء) يأتي بعد يوم الاثنين (الاثنين)، وقبل يوم الأربعاء (الأربعاء). وبالمثل، يمكنك استخدام التعداد لتمثيل أشهر السنة، حيث يأتي فبراير بعد يناير ولكنه يأتي قبل مارس. ترث جميع التعدادات المخصصة هذه الطريقة من الفئة المجردة java.lang.Enum ، ويتم ضبطها بواسطة المترجم عن طريق استدعاء المنشئ المحمي على java.lang.Enum ، والذي يأخذ اسمًا وترتيبيًا. 9) هل من الممكن استخدام Enum مع TreeSet أو TreeMap في Java؟ هذا سؤال مثير للاهتمام حقًا، وهو سؤال يحب الناس طرحه لاختبار عمق معرفتهم. حتى تنظر إلى كود java.lang.Enum ، ربما لن تعرف أن Enum يرث الواجهة القابلة للمقارنة ، والتي تعد متطلبًا أساسيًا للاستخدام في المجموعات المرتبة مثل TreeSet و TreeMap . وبما أن Enum يرث الواجهة القابلة للمقارنة بشكل افتراضي ، فيمكن استخدامه مع TreeSet و TreeMap . 10) ما الفرق بين ordinal() و CompareTo() في Enum؟ يأتي هذا مباشرة من السؤال السابق: في الواقع، يحاكي CompareTo() الترتيب الذي توفره الطريقة ordinal() وهو الترتيب الطبيعي لـ Enum. باختصار، يقيد Enum المقارنات بالترتيب الذي تم الإعلان عنه. ومن الجدير بالذكر أيضًا أن هذه الثوابت قابلة للمقارنة فقط مع ثوابت أخرى من نفس النوع - فمقارنة أنواع مختلفة من الثوابت يمكن أن تؤدي إلى خطأ في المترجم. 11) هل من الممكن استخدام Enum في حالة التبديل؟ نعم يمكنك ذلك. علاوة على ذلك، فهذه إحدى الفوائد الرئيسية لاستخدام Enum. نظرًا لأن مثيلات Enum تُترجم إلى ثابت مؤقت، فيمكنك حقنها بأمان داخل الحالة والتبديل . إليك مثال على التعليمات البرمجية مع أيام الأسبوع: public void developerState(DayOfWeek today){ switch(today){ case MONDAY: System.out.println("Hmmmmmmmm"); break; case TUESDAY: System.out.println("Hmmmm"); break; case FRIDAY : System.out.println("Yeahhhhhh"); break; } } Enum وSwitch يكملان بعضهما البعض بشكل جيد، خاصة إذا كان Enum يحتوي على عدد صغير من الثوابت الثابتة، على سبيل المثال، سبعة أيام من الأسبوع، 12 شهرًا من السنة، وما إلى ذلك. انظر إلى أمثلة أخرى لاستخدام حالة swith مع Enum . 12) كيفية التكرار من خلال مثيل التعداد بأكمله؟ إذا قمت بفتح java.lang.Enum ، فأنت تعلم أن التابع value() ‎ يُرجع مصفوفة من جميع ثوابت Enum. بما أن كل تعداد يرث java.lang.Enum ، فلديهم طريقة value() . باستخدامه، يمكنك التكرار عبر جميع ثوابت التعداد من نوع معين. انظر إلى أمثلة على ذلك من خلال حلقة foreach وطريقة value() . 13) ما هي إيجابيات وسلبيات استخدام Enum كمفردة؟ يوفر Enum اختصارًا سريعًا لتنفيذ النمط المفرد، وبما أنه تم تناوله في كتاب Java الفعال، فهو خيار شائع. للوهلة الأولى، تعد وحدة Enum الفردية واعدة ومريحة للغاية، مثل أنها تتحكم في إنشاء مثيل، وقابلة للتسلسل بشكل آمن، وفوق كل شيء، من السهل إنشاء وحدة فردية آمنة للخيط باستخدام Enum. لم تعد بحاجة للقلق بشأن التحقق مرة أخرى من تقلب المتغيرات. اقرأ المزيد عن إيجابيات وسلبيات استخدام هذا النهج هنا . 14) ما الفائدة من استخدام Enum بدلاً من int enumeration وString enumeration Patterns؟ إذا كنت تقوم بالبرمجة لأكثر من 5 سنوات ولا تزال في JDK 1.3 أو 1.4، فستكون على دراية بأنماط التعداد String و int ، التي تستخدم بادئة ثابتة نهائية عامة ثابتة لتمثيل مجموعة من الثابتات الثابتة المعروفة. أعداد الأشياء، مثل أيام الأسبوع . هناك العديد من المشاكل هنا: ليس لديك استقلالية عن نوع التعداد، حيث أن متغير السلسلة المسؤول عن يوم الأسبوع يمكن أن يأخذ أي قيمة عشوائية. وبالمثل، يمكن للقيمة القابلة للإحصاء أن تأخذ أي قيمة، وسوف يبتلعها المترجم بكل سرور. واستخدام Enum ، تحصل على نوع الأمان الذي يتحقق منه المترجم لك. هناك بعض الأفكار المثيرة للاهتمام حول هذا الموضوع في Java الفعالة، والتي يوصى بقراءتها لجميع مطوري Java. 15) كيفية تحويل السلسلة إلى التعداد؟ هذا سؤال يومي يظهر بسبب شعبية استخدام String و Enum في تطوير تطبيقات Java. أفضل طريقة لتحويل Enum إلى سلسلة هي تحديد طريقة مصنع على Enum نفسها والتي ستأخذ وسيطات السلسلة وتعيدها كـ Enum . قد ترغب أيضًا في تجاهل الحالة. فيما يلي بعض الأمثلة لتحويل السلاسل إلى تعدادات. يقودنا هذا إلى نهاية قائمتنا المكونة من 15 سؤالًا ( وإجابات ) حول Enum. لكن تذكر: القراءة ليست كافية للتعلم، إنها فقط الخطوة الأولى . للاستفادة من التعدادات، حاول العثور على المكان الذي يمكنك استخدام Enum فيه في مشروعك - فهذا سيمنحك تجربة واقعية، ومع هذه التجربة ستتعلم أكثر من الأمثلة، لأنك ستواجه المزيد من المشكلات التي يمكنك التعامل معها بشكل أكثر طرق معقدة ومفصلة.المتطلبات. تستحق هذه الأسئلة المتعلقة بـ Enum الاهتمام بها لاختبار معرفتك، خاصة إذا كنت في عجلة من أمرك لإجراء مقابلة ولا يوجد وقت للتعمق في عالم Enum.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION