对不起,如果这是一个重复或太简单,但我该如何做一个可以分类的单例类?如何让其他类从单例类派生出来?
回答
你通常不能在任何有用的意义上。这将是不使用Singleton类的另一个原因。
如果您已经定义了单为:
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();
,这样你就没有任何收获。
但是,没有理由不能做到这一点。
现在,如果你想向Singleton类添加更多的函数,那么你可以使用AspectJ中的类型间方面,并将新的方法/属性注入到Singleton中,然后Singleton就可以使用它们。
单身人士限制实例不是继承。那么 - 正如已经指出的那样,它限制了继承的有用性,然后你可以放松私有构造函数来打包或保护(你可能会认为它会减少singleton的单数)。但是目的是什么?
其实我认为这是不可能的。
通过声明其构造函数为private
来创建一个类的单例。但是如果你尝试声明你的单例类的子类,那么子类的构造函数将不能够看到超类的构造函数......所以它们不会被编译;例如
public class A() {
private A() { }
}
public class B() {
private B() { }
}
与太阳JDK 1.6和Eclipse编译木卫三给出一个编译错误,在构造B,以对于一个无参数的构造是不可见的效果。
你可以增加private
构造函数的可见性,但是除此之外没有任何东西可以阻止某人创建它的多个实例。换句话说,它不再是一个单身人士课程。
编辑:我想犹太教的另一种选择是定义一个或多个抽象(非单一)类的树与您想要常见的方法/成员,然后将多个单例类定义为叶类作为适当的。但这不是一个单独类别的另一个子类别。
正如其他人已经回复,单身人士亚类的使用很小。如果您需要单例环境中的策略模式,您可以定义一个接口并委派给单例实例中的该接口的实现。这将问题转移到一层,并更清楚地说明你为什么要这样做。
要回答你的问题;假设选择您的应用程序使用的是在例如在系统属性中定义的特定的子类,你可以这样做:
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()
方法已同步。
- 1. 如何从其他派生类访问其他派生类?
- 2. 如何创建派生类的单例?
- 3. 如何找出其派生类处理
- 4. 派生类和单例
- 5. 来自类实例的派生类?
- 6. 从基类返回派生类实例
- 7. 如何让派生类的流操作符也输出基类
- 8. C++派生类重写与其他派生类的基类成员?
- 9. C++基类如何知道从哪个类派生出来的类?
- 10. 如何让派生类只读成员?
- 11. 如何让jquery对象派生javascript类?
- 12. 如果派生类包含其他方法和成员,static_cast是否可以从基类完成派生类?
- 13. 从其他类找到表单实例
- 14. 如何从派生类获取基类实例
- 15. MEF导出派生类和新实例
- 16. 如何自动派生DataKinds派生类型的Typeable实例?
- 17. 如何强制派生类来实现,其接收作为参数派生
- 18. 基类的实例如何保存派生类的实例?
- 19. 从派生类到基类
- 20. 从基类INITIALISE派生类
- 21. 保存从基类派生的实例
- 22. 从基类实例化派生对象
- 23. 从派生的类
- 24. 如何:派生类中派生类的派生类与特定于派生类的方法
- 25. 从父类的实例创建派生类的实例
- 26. 从派生类(或其他设计)调用函数
- 27. 接口用于从基类派生的其他属性
- 28. 从派生自同一类的类派生的C++子类
- 29. 如何从基类的实例初始化派生类的实例?
- 30. 如何从其他类访问单例C++
为什么downvote?这似乎是一个合法的问题? – 2009-10-22 05:03:20
也许最近downvoter吃晚饭,目前感觉饱满,所以“饮食”的参考感觉没有吸引力......? – 2009-10-22 05:09:20
对不起@亚历克斯。当你发布它时,我毁了你的笑话。 – 2009-10-22 05:10:07