مقدمة: لماذا enum والسلسلة النصية رفيقان أبديان؟
\n\nتخيل: أنت تكتب برنامجًا يستقبل أوامر من المستخدم. المستخدم يدخل "RED"، ويجب على برنامجك أن يفهم أن هذا هو اللون Color.RED. أو أنك تقرأ بيانات من قاعدة بيانات، حيث يتم تخزين الحالة كنص "ACTIVE"، وفي الكود لديك enum Status.ACTIVE. كيف تربط بين السلسلة النصية و enum؟ هذا هو أحد أكثر الأسئلة شيوعًا على Stack Overflow بين مطوري Java المبتدئين - واليوم سنحل هذه المشكلة نهائيًا.
في هذه المقالة ستتعلم:
\n- \n
- كيفية الحصول على enum من سلسلة نصية في Java باستخدام
valueOf()\n - كيفية معالجة الحالة التي لا تكون فيها السلسلة النصية موجودة في enum (حتى لا يتعطل البرنامج) \n
- كيفية كتابة طريقة مخصصة للتحويل المرن \n
- كيفية التعامل مع حالة الأحرف والمسافات \n
هيا بنا!
\n\n1. ما هو enum ولماذا نحوله إلى سلسلة نصية؟
\n\nEnum (اختصار لـ enumeration - تعداد) هو نوع بيانات خاص في Java يحتوي على مجموعة ثابتة من الثوابت. على سبيل المثال، أيام الأسبوع، الألوان، حالات الطلب.
\n\npublic enum Color {\n RED, GREEN, BLUE, YELLOW\n}\n\nالعمل مع enum مريح: يصبح الكود قابلاً للقراءة، ويتحقق المترجم من أنك لا تستخدم قيمة غير موجودة. لكن غالبًا ما تأتي البيانات من العالم الخارجي - من ملف، قاعدة بيانات، أو إدخال المستخدم - في شكل سلاسل نصية. وهنا تظهر المشكلة: كيفية الحصول على enum من سلسلة نصية في Java؟
\n\n2. الطريقة الأساسية: طريقة valueOf()
\n\nأبسط طريقة مدمجة هي استخدام الطريقة الثابتة valueOf()، الموجودة في كل enum. تأخذ سلسلة نصية وتعيد الثابت المقابل في enum. مهم: يجب أن تتطابق السلاسل النصية مع أسماء الثوابت بالضبط من حيث حالة الأحرف.
public class Main {\n public static void main(String[] args) {\n String input = "RED";\n Color color = Color.valueOf(input);\n System.out.println("اللون: " + color); // الإخراج: اللون: RED\n }\n}\n\nenum Color {\n RED, GREEN, BLUE\n}\n\nهل يعمل؟ نعم. لكن هناك مشكلة. إذا قمت بتمرير السلسلة النصية "red" (بأحرف صغيرة) أو "PURPLE" (غير موجودة في enum)، فستقوم Java برمي استثناء IllegalArgumentException. وهذا يعني أن البرنامج سيتعطل. ليس جيدًا.
3. كيفية تجنب الأخطاء: معالجة الاستثناءات
\n\nلكي لا يتعطل البرنامج، يجب اعتراض الاستثناء. هذا مهم بشكل خاص عندما تحصل على enum من سلسلة نصية أدخلها المستخدم.
\n\npublic static Color getColorFromString(String input) {\n try {\n return Color.valueOf(input.toUpperCase());\n } catch (IllegalArgumentException e) {\n System.out.println("خطأ: اللون '" + input + "' غير موجود!");\n return null; // أو قيمة افتراضية\n }\n}\n\npublic static void main(String[] args) {\n String userInput = "blue";\n Color color = getColorFromString(userInput);\n if (color != null) {\n System.out.println("لقد اخترت: " + color);\n }\n}\n\nلاحظ: استخدمنا input.toUpperCase() - وهذا يسمح بقبول السلاسل النصية بأي حالة أحرف. في Java، من المعتاد كتابة أسماء enum بأحرف كبيرة، لذا فإن هذه الحيلة تعمل دائمًا تقريبًا.
4. الطريقة المتقدمة: طريقة مخصصة مع Map
\n\nأحيانًا لا تتطابق أسماء الثوابت في enum مع ما يأتي من الخارج. على سبيل المثال، لديك enum بأسماء عربية أو بمسافات. في مثل هذه الحالات، تحتاج إلى إنشاء تعيين (mapping) خاص بك.
\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic enum Status {\n ACTIVE("نشط"),\n INACTIVE("غير نشط"),\n PENDING("قيد الانتظار");\n\n private final String displayName;\n\n Status(String displayName) {\n this.displayName = displayName;\n }\n