JavaRush /مدونة جافا /Random-AR /تهيئة قوس مزدوج
Joysi
مستوى

تهيئة قوس مزدوج

نشرت في المجموعة

1. تهيئة الدعامة المزدوجة

التهيئة باستخدام الأقواس المزدوجة ( المشار إليها فيما يلي باسم تهيئة الأقواس المزدوجة ) هي أداة Java لإنشاء مجموعات مثل القائمة والتعيين والخريطة في وقت واحد مع إعلانها.
تهيئة الدعامة المزدوجة - 1
عندما تحتاج إلى قوائم ذات عناصر ثابتة، مثل قائمة المنتجات أو العملات المدعومة، فإن الإعلان عن القائمة في نفس وقت تهيئتها يعمل على تحسين إمكانية قراءة التعليمات البرمجية. هذا هو السبب في أن التهيئة ذات الأقواس المزدوجة تكتسب شعبية، حيث لا توجد طرق قياسية أخرى لإنشاء مجموعات مع التهيئة المتزامنة في التعليمات البرمجية. لسوء الحظ، على عكس لغات البرمجة الأخرى، لا تدعم Java مجموعات من القيم الحرفية. بسبب هذا القيد، فإن إنشاء قائمة غير قابلة للتعديل حتى مع عدد صغير من العناصر يجبرنا على كتابة العديد من أسطر التعليمات البرمجية في شكل استدعاءات متكررة add()لإضافة العناصر المطلوبة مع التغليف النهائي:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(3);
list.add(5);
list.add(7);
List<Integer> unmodifiableList = Collections.unmodifiableList(list);
وهذا وصف زائد عن الحاجة ويمكن تبسيطه. دعونا نملأ القوائم الثابتة بطريقة مناسبة لنا، أي مباشرة في كتل ثابتة أثناء التهيئة، وهو ما Double braceستساعدنا فيه التهيئة، مما يسمح لنا بكتابة كل شيء في سطر واحد:
List<Integer> list = Collections.unmodifiableList(new ArrayList<Integer>() {{
        add(2);
        add(3);
        add(5);
}});
وبالمثل، Double braceستساعدنا التهيئة في ملء القيم و HashMap:
Map<Integer, String> intToString = new HashMap<Integer, String>(){{
         put(1, "one");
         put(2, "two");
         put(3, "three");
 }};
يبدو كل شيء أنيقًا للغاية، ولكن له عيوبه، مما يجعل تهيئة الدعامة المزدوجة نمطًا مضادًا. سننظر إليهم بمزيد من التفصيل في الفصل التالي.

إيجابيات وسلبيات تهيئة الدعامة المزدوجة.

Doubleتستخدم تهيئة الدعامة إنشاء فئة داخلية مجهولة . ما كان مخفيًا في البداية على السطح هو أن Double braceالتهيئة تنشئ فئة مع مزيد من التهيئة لمثيلها في كل مرة تستخدمها. بالإضافة إلى ذلك، يتم استخدام مرجع مخفي لهذه الفئة الخاصة، مما قد يؤدي بنا إلى تسرب محتمل للذاكرة. لا يمكنك أيضًا استخدام عامل التشغيل الخفي للأدوية العامة (عامل الماس < >)، حيث لا يمكننا الوصول إلى داخل فئة مجهولة.
(من المترجم: مرة أخرى بمزيد من التفصيل:
بعد الأول {، يتم إنشاء فئة مجهولة داخلية، وبعد الثانية، {تحدث التهيئة عند إنشاء مثيل للفئة، حيث يمكننا الوصول إلى الحقول والأساليب الخارجية ( نسبة إلى فئة المجهول).
الايجابيات:
  1. تقليل الخطوط في الكود
  2. الإنشاء والتهيئة في تعبير واحد.
السلبيات:
  1. إنشاء فئة مجهولة مخفية عنك.
  2. مما يكلفنا تكاليف إضافية لمثيله في كل مرة نستخدمه.
  3. في كل مرة يتم إنشاء مرجع مخفي له، مما قد يؤدي إلى تسرب الذاكرة.
الحكم: نظرًا للسلبيات المذكورة أعلاه ووجود بدائل للقوس المزدوج، يُنظر إلى التهيئة على أنها نمط مضاد في عالم Java. احفظ القطة

بدائل لتهيئة الأقواس المزدوجة في Java

والخبر السار هو أن هناك طرقًا أخرى لتحقيق نفس الأهداف في Java. يمكننا التنفيذ في سطر واحد من التعليمات البرمجية لإنشاء وتهيئة ArrayList باستخدام مُنشئ النسخ من فئة Collection كما هو موضح أدناه:
List<Integer> list = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(2, 3, 5)));
Arrays.asList()سيعيد لنا قائمة ذات طول ثابت تم تمريرها إلى ArrayListمُنشئ النسخة. ضع في اعتبارك الفرق بين القوائم ذات الطول الثابت التي يتم إرجاعها من Arrays.asList()و Collections.unmodifiableList(): لا يمكنك إضافة أو إزالة عناصر ArrayList-، ولكن يمكنك تغيير عنصر حسب الفهرس باستخدام set()، وهو ما لا يمكنك فعله مع القائمة التي يتم إرجاعها بواسطة Collections.unmodifiableList(). إذا كنت ترغب في الحصول على قائمة صغيرة، فهذه هي الطريقة الأفضل، على الرغم من أنها ستكون أقل شفافية بالنسبة Setللمجموعات الأخرى، لذلك سيتعين عليك إنشاؤها Listقبل إنشاء Set-a. ولكن هذا لا يزال أفضل من تهيئة الأقواس المزدوجة، لأنه في هذه الحالة لا يتم إنشاء فئة مجهولة داخلية إضافية في كل مرة يتم استخدامها. إذا كنت تقوم بتشغيل Java 8، فلديك طريقة بديلة أخرى. ستساعدك واجهة برمجة التطبيقات JDK 8 Stream API على إنشاء مجموعات صغيرة من خلال دمج Stream Factoryطرق الإخراج في مجموعة List:
List<String> list = Collections.unmodifiableList(Stream.of("abc", "bcd", "cde").collect(toList()));
لأنه Setيمكنك استخدام Collectors.toSet()الطريقة بدلاً من ذلك Collectors.toList()على النحو التالي:
Set<String> set = Collections.unmodifiableSet(Stream.of("abc", "bcd", "cde").collect(toSet()));
بالمناسبة، Stream collectلا تضمن الأساليب حماية المجموعات التي تنشئها من التغييرات. في Java 8، المجموعات التي أعادوها (مثل - و ArrayListو HashSetو HashMap) شائعة جدًا (يمكننا تغييرها)، ولكن قد يتم تصحيح هذه الحقيقة في إصدارات JDK المستقبلية. هذا كل ما يتعلق الآن Double braceبالتهيئة في Java. هذا القالب مقبول للاختبارات والعروض التوضيحية، ولكنه ليس جيدًا بما يكفي للاستخدام في الإنتاج. نظرًا لعيوبها المتأصلة، أصبحت التهيئة ذات الدعامة المزدوجة نمطًا مضادًا هذه الأيام، خاصة في ضوء البدائل المتاحة. أنا شخصياً ما زلت أستخدم هذا البناء لتهيئة الخرائط الثابتة وهذا كل شيء. لأنني Listأفضل الإنشاء Collectionsمن خلال الدمج مع الإنشاء Array.asListفي منشئه. وإذا كنت أستخدم Java 8 - فإن التصميم باستخدام Stream API و collect(). مقالات ذات صلة: إذا استمتعت بهذا البرنامج التعليمي وترغب في معرفة المزيد حول أنماط برمجة Java ومبادئها وأفضل الممارسات، فقد ترغب أيضًا في الاطلاع على المقالات الأخرى الموجودة على موقعنا . القراءة الموصى بها: إذا كنت تريد معرفة المزيد عن الأنماط وأفضل الممارسات، فعليك بقراءة البرمجة الفعالة لجوشوا بلوخ ، فلا يمكن لأي كتاب أن يحل محلها. وإذا كنت ماهرًا بالفعل في لغة Java وتبحث عن كتاب عن أنماط التصميم، وأسلوب عرضه الفكاهي مثير للاهتمام وسهل القراءة، انتبه إلى "الرأس أولاً". أنماط التصميم " .
من المترجم: لقد تعمدت تقديم رابط لكتاب بلوخ الأصلي، لأن ترجمته إلى اللغة الروسية لم تنجح (على سبيل المثال، Builder = مُنشئ).
ترجمة المقال ما هي التهيئة المزدوجة في Java؟ مثال على النمط المضاد (تم نشره في أكتوبر 2015).
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION