Java 关于将构造函数说明符从private更改为singleton的protected
如果我们将单例的构造函数从private更改为protected,会发生什么?在这种情况下,我们如何防止它破裂 单身人士:Java 关于将构造函数说明符从private更改为singleton的protected,java,design-patterns,Java,Design Patterns,如果我们将单例的构造函数从private更改为protected,会发生什么?在这种情况下,我们如何防止它破裂 单身人士: public class SingletonObject { private static SingletonObject ref; private SingletonObject () //private constructor { System.setSecurityManager(new SecurityManager());
public class SingletonObject
{
private static SingletonObject ref;
private SingletonObject () //private constructor
{
System.setSecurityManager(new SecurityManager());
}
public static synchronized SingletonObject getSingletonObject()
{
if (ref == null)
ref = new SingletonObject();
return ref;
}
public Object clone() throws CloneNotSupportedException
{
throw new CloneNotSupportedException ();
}
}
要断开单例,以下url包含所需信息。简单:将构造函数访问修饰符从
private
更改为protected
允许同一包中的任何类实例化SingletonObject
。通过指定相应的package
语句,我们可以轻松地创建“在同一个包中”的类
编辑:Carlos的回答让我意识到了另一个问题,这是由于将构造函数设置为受保护的
而不是公共的
:可以创建singleton类的子类(在另一个包中),它可以自由实例化并调用其实例方法;singleton类本身不再完全控制实例(或1个实例)的创建位置和方式。来自singleton属性:
私有构造函数只调用一次,以初始化公共构造函数
静态最终字段(…)。缺乏公共或受保护的环境
构造函数保证了一个“单实例”宇宙:正好是一个(…)
初始化Singleton类后,实例将不再存在
较少的客户所做的任何事情都不能改变这一点
因此,如果你让你的单例构造函数受到保护,你就是在公开你的构造函数,让同一个包中的任何类把实例变成SingletonObject
的实例。如果发生这种情况,你的单身模式就被打破了
以任何方式放松构造函数的访问修饰符(使其受保护、公开或默认)都是实例生成的开放大门,这在单例实现中是不需要的。那么你的意思是说,在这种情况下,单例法则将被打破,不再是单例,请您发布代码,以便理解清楚。@UmNyobe请详细解释,因为我还没有完全理解。如果
SingletonObject
在packagexyz
中,我们可以在packagexyz
中创建另一个类,该类可以创建所需数量的SingletonObject
实例。因此,使用protected
构造函数,SingletonObject
无法再确保任何时候只有一个实例。protected将构造函数公开给子类,而不是同一个包中的类。实际上,它是这样做的。试试看。正如我在上面的回答中所评论的,如果不在同一个包中,子类就不能实例化该类。然而,由于子类本身可能被实例化,这也可以被认为是单例的破坏。一个子类只能实例化“单例”类,如果它在同一个包中。但是,另一个包中的子类可以自己实例化。我们不知道这一点。回答固定xD