java单例继承_关于继承:如何在Java中实现抽象单例类?

这是我的示例抽象单例类:

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

您试图让抽象类扮演两个非常不同的角色:

的抽象工厂角色

(单例)服务可以具有

多重可替代

实现,

服务

界面角色,

最重要的是,您还希望该服务为单例并在整个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值