هل من المعقول استخدام مثيل ثابت في Java؟

لم أتمكن من العثور على إجابة لهذا السؤال على Google ، لذا هنا.

هل من المقبول استخدام كائن ثابت بحيث يمكن لبقية البرنامج الرجوع إلى الكائن؟ لا أعرف بالضبط كيف أقوم بتوضيح سؤالي ، لذلك سأقوم فقط بعرض رمز المثال.

public class Client {

    Frame f;
    private static Client mainClient;

    public static void main(String[] args){
        new Client().init();
    }

    private void init(){

        mainClient = this;
        f = new Frame();

    }

    public static Client getClient() {
        return mainClient;
    }

    public Frame getFrame(){
        return f;
    }   
}

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

شكر

4
@ Jtvd78 الجواب القصير هو: هذا مقبول تماما. فقط انتبه لسلامة الموضوع ، إذا كنت تستخدم خيوط.
وأضاف المؤلف emesx, مصدر
من المهم ملاحظة أنه لا يوجد شيء اسمه "مثيل ثابت". هناك متغيرات ثابتة ، لكن الكائن ليس ثابتًا بطبيعته أو لا.
وأضاف المؤلف Jon Skeet, مصدر
لتوضيح ، هناك مثيل واحد فقط من العميل ، مما يجعل نسخة واحدة فقط من الإطار. وهذا في جميع أنحاء البرنامج بأكمله. أما بالنسبة لسلامة موضوع ، يمكن للشخص أن يوضح لماذا هذا غير آمن موضوعيا؟ كما ذكرت أنك قد تكون بديلاً أفضل لمشاركة نموذج البيانات. وسوف ننظر في ذلك كخيار
وأضاف المؤلف Jtvd78, مصدر
قد يكون من المفيد طرح السؤال التالي: 1) ما إذا كان هناك دائمًا إطار واحد تمامًا خلال عمر هذا التطبيق ، 2) ما إذا كانت جميع أجزاء البرنامج تحتاج حقًا للوصول إلى الإطار بالكامل ، و 3) ما إذا كان يجب مشاركة نموذج البيانات بدلا من الإطار.
وأضاف المؤلف Andy Thomas, مصدر

8 إجابة

يعتمد على أكثر من شيء واحد ...

1) الاستخدام . هل تريد أن تكون قادرا على قول MyClass.getClient() والحصول على مرجع لمتغير العميل؟ إذا كنت تهدف إلى نوع معين من الشيء - نعم. إذا كنت تهدف إلى شيء ملائم للغاية - نعم إذا كانت آمنة ، إذا كنت تريد فقط أن تكون مرئية في كل مكان - لا. إذا كان الوصول إليه من مكان/وقت خاطئ يؤدي إلى حدوث أعطال وأخطاء - لا.

2) الأشخاص سيستخدم الأشخاص ما تعرضه ، الفترة. إذا رأوا أن الرمز الخاص بك يجلب العميل مثله ، فسيستخدمه عندما يكون غير مناسب أيضًا ، فهل سيسبب ذلك العديد من الأخطاء؟ :)

3) التصميم هل أنت في حاجة إليها حقًا؟ هل هو أكثر نظافة لتمريرها مثل حجة من الوصول المطلق إليها في أي وقت؟

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

6
وأضاف
+1: ما يصلح للواجب المنزلي ليس لبرنامج المؤسسة هذا هو الذهب الخالص.
وأضاف المؤلف Luiggi Mendoza, مصدر

لفهم ما إذا كنت في حالتك على ما يرام لاستخدام نمط Singleton يجب عليك أن تسأل "هل يبقى هذا المكون هو نفسه خلال عمر التطبيق؟" ، إذا كان الجواب نعم ، فمن الأفضل عزله في فصل دراسي من تلقاء نفسه.

1
وأضاف

يُطلق على ما تصفه اسم نمط المفردات . على الرغم من أن هناك بعض النقاد هو نمط يستخدم عادة.

سيكون البديل الثاني لإعطاء الكائن لكل مُنشئ هو إطار حقن التبعية . بالنسبة إلى Java ، سيكون أحد أفضل الخيارات الربيع .

1
وأضاف
كبديل للربيع ، أوصي بـ guice
وأضاف المؤلف mariosangiorgio, مصدر
mariosangiorgio كبديل لكل من Spring و Guice في بيئة Java EE 5+ أوصي باستخدام EJB 3 و/أو CDI.
وأضاف المؤلف Luiggi Mendoza, مصدر

لقد أنشأت للتو شكلًا مختلفًا من نمط SingleTon . يتم استخدام كائن ثابت عندما تحتاج إلى مثيل واحد فقط من هذا الكائن في المشروع بأكمله.

الهيكل الأساسي لفرد واحد هو

public class Client {
    private static Client mainClient;


    private void Client (){
        //do initial tasks
    }

    public static Client getClient() {
        if(mainClient == null)
            mainClient = new Client();
        return mainClient;
    }

    public Frame getFrame(){
        return f;
    }   
}

لذا يمكنك الحصول على الإطار باستخدام

Client.getClient().getFrame();
0
وأضاف
غير متأكد إذا كان يريد مثيل واحد بالضبط ، أو سهولة الوصول ، وهذا هو الشيء .... :)
وأضاف المؤلف Shark, مصدر

استخدام حالة ثابتة على ما يرام تماما للثوابت/الأشياء الثابتة.

أما بالنسبة للأشياء القابلة للتغيير ، فإنه يعتمد. في برامج بسيطة مع موضوع واحد ، يعمل بشكل جيد. ومع ذلك ، إذا كانت متعددة الخيوط أو مجمعة ، يجب عليك استخدام singleton بحذر أو لا على الإطلاق.

0
وأضاف

It is ok to do that. It would be helpful for you to read about singleton pattern

0
وأضاف
"موافق" هو ​​المبالغة قليلا. يعتبر سينجلتون على نطاق واسع نوعًا مضادًا للنمط في هذه الأيام ، في معظم الحالات. في الغالب ، يميل الناس إلى عدم معرفة المكان الذي يجب أن يستخدموا فيه ويجب عدم استخدامه ، وينتهي بهم الأمر بتحويل كل شيء إلى أحادية. : P
وأضاف المؤلف cHao, مصدر

حسنًا ، هذا التنفيذ لنمط المفرد هو الذي أكرهه أكثر. حسنًا ، من السهل جدًا ترميزها ، ولكن لاحقًا ، إذا كان هناك شيء يجب تغييره ، فسيتعين عليك تغييره في ملايين الأماكن. بالنسبة لنمط singleton ، يمكنني استخدام نمط Dependency Injection - Inversion of Control مع نمط Singleton factory وترك متغيرات ثابتة بشكل حصري لـ ثوابت (على سبيل المثال ، السلاسل ، الأعداد الصحيحة ...).

فيما يتعلق بسؤالك ، كل شيء مقبول. يعتمد التنفيذ على متطلبات مشروعك.

0
وأضاف
@ André ما يصلح لبرمجيات الشركة قد لا للفروض المنزلية ، والعكس بالعكس.
وأضاف المؤلف Shark, مصدر
Andre: هذه هي الكلمة الصحيحة هناك - أنت. في بعض الحالات ، مدرس الدورة التدريبية/TA ، في بعض الحالات الأخرى - عميل جاهل قام بشراء رمز القسم الخاص بك والذي تم إنتاجه بموجب إرشادات صارمة والإشراف على مدير لم يلمس الكود مطلقًا ... كل شيء مقبول ، بالنظر إلى الظروف والسياقات الصحيحة :د
وأضاف المؤلف Shark, مصدر
@ أندريه: نعم ، كل بنية ومفهوم لها بعض الاستخدام في بعض السياق. إذا لم يحدث ذلك ، فلن يكون موجودًا. تكمن المشكلة الكبرى في معرفة السياق الذي يفيد فيه مفهوم معين.
وأضاف المؤلف cHao, مصدر
"كل شيء مقبول" ؟؟؟
وأضاف المؤلف André Stannek, مصدر
وجود بعض الاستخدام لا يعني أنه مقبول. أوافق على أن ذلك يعتمد على السياق ، ولكن هناك أيضًا الكثير من الأشياء التي يمكنك القيام بها في البرمجة والتي لن أعتبرها مقبولة.
وأضاف المؤلف André Stannek, مصدر

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

0
وأضاف