كيف يمكنني جعل الطبقات الأخرى تستمد من فئة المفردة؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا آسف إذا كان هذا هو نسخة مكررة أو الابتدائية للغاية، ولكن كيف أقوم بإجراء فئة المفردة التي يمكن أن يكون subclassed؟

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

المحلول

وستيف ييغج ديه href="http://steve.yegge.googlepages.com/singleton-considered-stupid" المقالة حول سنغلتونس الذي يذكر إن شاء subclasses ترث في هذا الاقتباس :

<اقتباس فقرة>   

وثم هناك شيء إن شاء subclasses ترث.   انه من المستحيل تقريبا إلى فئة فرعية   المفرد، وإذا كنت تدير ذلك، ثم   يجب أن لا يكون تم استخدام   المفرد في المقام الأول. أنت   لا <م> حتى أريد أن أذهب إلى هناك. لقد قمت   مشى الطرق التي لا أجرؤ على إعادة فرز الأصوات.   مجرد التظاهر كنت لا تستطيع أن تفعل ذلك، و   عليك إنقاذ نفسك كميات مذهلة   من الألم.

نصائح أخرى

وأنت عموما لا يمكن، بأي معنى مفيد. وهذا من شأنه أن يكون سببا آخر لعدم استخدام الطبقات المفرد.

في الواقع، أنا لا أعتقد أن ذلك ممكن.

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

public class A () {
    private A() { }
}

public class B () {
    private B() { }
}

وكل من الشمس JDK 1.6 و مترجم الكسوف جانيميد تعطي خطأ الترجمة في منشئ B، ومفادها أن منشئ عدم وسائط لوغير مرئية.

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

وتحرير: أعتقد أن بديل كوشير أن يكون لتعريف شجرة (غير المفرد) الطبقات واحد أو أكثر تجريدا مع الأساليب / الأعضاء التي ترغب في أن تكون مشتركة، ومن ثم تحديد الطبقات المفردة متعددة كما في الطبقات ورقة كما مناسب. لكن ليس هذا هو واحد من الدرجة المفرد إن شاء subclasses ترث بعضها البعض.

إذا كنت قد حددت المفرد الخاص بك على النحو التالي:

public class Singleton {
  private static Singleton instance;
  public static Singleton getInstance() {
     if (instance == null) {
       instance = new Singleton();
     }
     return instance;
  }
  private Singleton() {
  }
}

وبعد ذلك يمكنك القيام به فقط:

public class NewSingleton extends Singleton {
}

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

ولكن، ليس هناك سبب لماذا لا تستطيع ان تفعل ذلك.

والآن، إذا كنت ترغب في إضافة المزيد من الوظائف إلى فئة سينغلتون ثم يمكنك استخدام الجوانب بين نوع من AspectJ ومجرد حقن أساليب جديدة / خصائص في سينغلتون التي يمكن بعد ذلك يتم استخدامها من قبل سينغلتون.

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

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

لإجابة على سؤالك. على افتراض أن خيار للفئة فرعية معينة يعرف التطبيق يستخدم في على سبيل المثال خصائص النظام، يمكنك أن تفعل شيئا مثل:

public static synchronised Singleton getInstance() {
    if (instance == null) {
        String clsName = System.getProperties().getProperty("singleton.class");
        if (className == null || 0 == clasName.length()) {
            instance = new Singleton();
        } else {
            Class cls = Class.forName(clsName);
            instance = (Singleton) cls.newInstance();
        }
     }
     return instance;
}

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top