这是我的示例抽象单例类:
public abstract class A {
protected static A instance;
public static A getInstance() {
return instance;
}
//...rest of my abstract methods...
}
这是具体的实现:
public class B extends A {
private B() { }
static {
instance = new B();
}
//...implementations of my abstract methods...
}
不幸的是,我无法让B类中的静态代码执行,因此实例变量从未设置。 我已经试过了:
Class c = B.class;
A.getInstance() - returns null;
和这个
ClassLoader.getSystemClassLoader().loadClass("B");
A.getInstance() - return null;
在eclipse调试器中运行这两个代码,静态代码永远不会执行。 我可以找到的执行静态代码的唯一方法是将B的构造函数的可访问性更改为public,并对其进行调用。
我在Ubuntu 32位上使用sun-java6-jre运行这些测试。
抽象单例?对我来说听起来不可行。 Singleton模式需要一个private构造函数,这已经使子类化成为不可能。您需要重新考虑您的设计。抽象工厂模式可能更适合于特定目的。
Singleton中的私有构造函数的目的是防止其他任何人实例化它。我已经在这里实现了这一点-您无法实例化一个抽象类,并且该子类具有私有构造函数。
它不会强制子类仅是抽象的,并且仅具有私有构造函数。
Singleton不需要私有构造函数(请参阅我的答案以使用公共构造函数解决此问题)。
抱歉,您的答案是无用的。私有构造函数是单例模式的关键要求。如果您没有一个人,那么您实际上没有一个人。阅读的食物:butunclebob.com/ArticleS.UncleBob.SingletonVsJustCreateOne
您试图让抽象类扮演两个非常不同的角色:
的抽象工厂角色
(单例)服务可以具有
多重可替代
实现,
服务
界面角色,
最重要的是,您还希望该服务为单例并在整个