كيفية تهيئة HashMap في Java دون جنون: تحليل كامل للمبتدئين
\n\nهل سبق لك أن كتبت كودًا بلغة Java وشعرت أن إنشاء قاموس بسيط يتطلب كتابة قصيدة كاملة؟ خاصة عندما تريد القيام بذلك بشكل أنيق ومضغوط، كما في Python أو JavaScript. ألم مألوف؟ على Stack Overflow، سؤال حول كيفية تهيئة HashMap بطريقة حرفية حصد آلاف المشاهدات. وهذا ليس من قبيل الصدفة.
\n\nفي هذه المقالة، سنستعرض جميع الطرق القانونية لتهيئة HashMap في Java، من الطريقة الكلاسيكية إلى الحديثة، مع أمثلة كود وشروحات للمبتدئين. ستتعلم كيفية ملء الخريطة بسطر واحد، ومتى تستخدم Map.of()، ولماذا تهيئة double brace هي سلاح ذو حدين.
لماذا مجرد "وضع" العناصر هو ألم؟
\n\nتخيل أنك بحاجة لإنشاء HashMap بثلاثة أزواج "مفتاح-قيمة". الكود النموذجي للمبتدئ يبدو هكذا:
\n\nHashMap<String, Integer> map = new HashMap<>();\nmap.put("apple", 5);\nmap.put("banana", 3);\nmap.put("orange", 7);\n\nيبدو الأمر طبيعيًا، ولكن عندما يكون لديك عشر خرائط من هذا القبيل، يتحول الكود إلى ورقة طويلة. ألا تريد الإيجاز، أليس كذلك؟ في Python يتم ذلك بسطر واحد: dict = {"apple": 5, "banana": 3}. وفي Java؟ مفاجأة: هناك عدة طرق، وسنستعرضها الآن.
الطريقة رقم 1: تهيئة Double Brace (التهيئة المزدوجة)
\n\nالطريقة الأكثر شيوعًا (والأكثر إثارة للجدل) هي تهيئة double brace. تبدو هكذا:
\n\nHashMap<String, Integer> map = new HashMap<>() {{\n put("apple", 5);\n put("banana", 3);\n put("orange", 7);\n}};\n\nكيف يعمل هذا؟ الأقواس المتعرجة الأولى تنشئ فئة داخلية مجهولة ترث من HashMap. الثانية هي كتلة تهيئة المثيل، التي يتم تنفيذها عند إنشاء الكائن. كل ما بداخلها هو استدعاءات put().
الإيجابيات:
\n- \n
- يصبح الكود أكثر إحكامًا وقابلية للقراءة. \n
- لا حاجة لكتابة عدة أسطر مع
put(). \n
السلبيات (وهي كثيرة):
\n- \n
- الأداء: يتم إنشاء فئة مجهولة في كل مرة. هذا عمل إضافي لـ JVM. \n
- الذاكرة: الفئة المجهولة تحتوي على مرجع للفئة الخارجية، مما قد يسبب تسربًا للذاكرة. \n
- التسلسل: إذا حاولت تسلسل مثل هذه الخريطة، فقد تواجه مشاكل. \n
- عدم التوافق: لا تعمل مع بعض الأطر (مثل بعض إصدارات Gson). \n
الخلاصة: الطريقة تعمل، ولكن من الأفضل استخدامها فقط في كود الاختبار أو المشاريع الشخصية. للإنتاج - غير موصى بها.
\n\nالطريقة رقم 2: Guava (مكتبة من Google)
\n\nإذا كنت تستخدم Google Guava (وهي مكتبة شائعة جدًا)، فسيتم حل المشكلة بأناقة:
\n\nimport com.google.common.collect.ImmutableMap;\n\nMap<String, Integer> map = ImmutableMap.of(\n "apple", 5,\n "banana", 3,\n "orange", 7\n);\n\nالميزات:
\n- \n
- يتم إنشاء خريطة غير قابلة للتغيير (immutable). \n
- طريقة
of()محملة بشكل زائد لـ 0-5 أزواج. إذا كان أكثر، استخدمImmutableMap.builder(). \n - مناسبة تمامًا للتكوينات والبيانات الثابتة. \n
العيب: تحتاج إلى إضافة تبعية خارجية. إذا كان المشروع يستخدم Guava بالفعل - ممتاز. إذا لم يكن - ربما لا يستحق العناء.
\n\nالطريقة رقم 3: Java 9+ - Map.of() و Map.ofEntries()
\n\nابتداءً من Java 9، ظهرت طريقة M