Java Singleton نمط ، هل يجب أن تكون جميع المتغيرات متغيرات فئة؟

StackOverflow https://stackoverflow.com/questions/1767601

سؤال

إذا قام الفصل بتنفيذ نمط مفردة ، فهل يجب الإعلان عن جميع المتغيرات ثابتة؟

هل هناك أي سبب لا ينبغي إعلانه ثابتًا؟ وهل هناك فرق؟

هل كانت مفيدة؟

المحلول

لا. نمط Singleton يعني فقط أن مثيلًا واحدًا هو المثيل الوحيد - فهذا لا يعني "جعل كل شيء متاحًا بشكل ثابت".

يمنحك نمط Singleton جميع فوائد "مثيل واحد" ، دون التضحية بالقدرة على اختبار الكود الخاص بك وإعادة تجديده.

يحرر:

النقطة التي أحاول توضيحها هي أن هناك فرقًا بين كيفية استهلاك الوظيفة (وهو ما يعتمد على السياق) ، وكيف ينبغي تهيئة الوظائف.

قد يكون من المناسب أنه في معظم الحالات ، لن يكون لكائنك سوى مثيل واحد (على سبيل المثال ، في نظام الإنتاج النهائي). ولكن هناك أيضًا سياقات أخرى (مثل الاختبار) التي أصبحت أكثر صعوبة إذا أجبرت على أن تكون الخيار الوحيد.

أيضًا ، فإن صنع شيء ثابت له آثار أكثر أهمية من مجرد "يجب أن يكون هناك مثال واحد فقط من صفي" - وهو عادة ما يكون النية.

علاوة على ذلك ، في البرامج التي عملت عليها ، غالبًا ما يتم التحكم في تهيئة ودورة حياة الكائنات من قبل شخص آخر (أنا أتحدث عن DI هنا) - وجعل شيئًا ثابتًا لا يساعد هنا.

نصائح أخرى

في نمط مفرد مشترك ، أنت تفعل ليس استخدم الإحصائيات. تقوم بترمح الفصل لاستخدام الحقول العادية ، وتتم تهيئة في المنشئ ، ثم ترتب لتنفيذ جديد MyClass() مرة واحدة ، تخزين النتائج في مكان ثابت.

لا ، الشيء الوحيد الذي عادة ما يكون ثابتًا هو الإشارة إلى المفرد نفسه (وهناك طرق أخرى لتخزين هذه الإشارة أيضًا ، مثل JNDI أو حاويات حقن التبعية).

السبب في عدم إعلان الحقول ثابتة (على الرغم من أن نمط المفرد ، ستحتاج إلى مثيل واحد منها فقط) هو أن هذا يمنحك المرونة لإنشاء مثيل آخر مختلف قليلاً لفئة Singleton عادةً. قد ترغب في القيام بذلك في المواقف الخاصة ، مثل الاختبار.

حتى لو كنت (تعتقد أنك) بحاجة إلى هذه المرونة ، فلا يوجد سبب للتخلي عنها. إن إعلان الحقل كستاتيك ليس له فوائد ستخسرها.

أنت يستطيع افعل هذا (ليس بالضرورة ينبغي). لكن ، حتى بالنسبة للفرد ، أميل إلى جعل جميع المتغيرات على مستوى كائن بدلاً من مستوى الفصل لأن:

  • قد أقرر في مرحلة ما أن المفرد كان فكرة سيئة لتلك الفئة وأن وجود متغيرات على مستوى الفصل سيجعل إعادة تمثيل أكثر صعوبة.
  • مع المتغيرات على مستوى الكائن ، فإنها تأتي فقط إلى الوجود عندما تقوم بتسهيل المفرد. مع مستوى الفصل ، هم دائمًا هناك.

خلاصة القول: لم أتمكن مطلقًا من التفكير في عيب في الحصول عليها كمستوى على مستوى الكائن ، وهكذا أفعل ذلك. قد تكون العيوبان المذكورتان أعلاه على مستوى الفصل ضئيلًا ولكنهما موجودان. ربما يتعلق الأمر بالتفضيل الشخصي في النهاية.

يمكنك قراءة كيف (طريقة واحدة ممكنة) لإنشاء مفردة في جافا هنا:

Wikibooks أنماط تصميم: Java Singleton

في الأساس ، لا تحتاج (ولا ينبغي) أن تجعل كل شيء في الفصل ثابتًا لمجرد أنك تنوي استخدام شيء ما كفرد. هناك عدة أسباب

  • تحقق من الإجابات من Paxdiablo و Thilo
  • لا تنس أيضًا أن تجعلها ثابتة لا تجعله مفردة ستحتاج أيضًا إلى إزالة كل مُنشئ (وجعل المُنشئ الافتراضي خاصًا)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top