如果我们将单例的构造函数从private更改为protected会发生什么?在这种情况下我们如何防止它破裂?
的Singleton:
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 ();
}
}
为了打破单身,以下网址包含所需的信息cracking singleton with other ways。
答案 0 :(得分:1)
简单:将构造函数访问修饰符从private
更改为protected
允许同一包中的任何类实例化SingletonObject
。我们可以通过指定相应的package
语句轻松地在“同一个包中”创建一个类。
编辑:Carlos的回答让我意识到构造函数protected
而不是public
导致的另一个问题:单例类的子类可以是创建(在另一个包中),可以自由地实例化并调用其实例方法;单例类本身不再完全控制实例(或1个实例)的创建位置和方式。
答案 1 :(得分:1)
来自单身人士属性的Joshua Bloch's Effective Java:
私有构造函数只被调用一次,以初始化公共 静态最终字段(...)。缺乏公共或受到保护 构造函数保证“ monoinstance ”Universe:正好一个(...) 一旦 Singleton 类被初始化,实例就会存在 - 不多了,没有 减。客户所做的任何事情都无法改变这一点。
因此,如果你使Singleton Constructor受到保护,你就会暴露你的构造函数,让同一个包中的任何类使实例成为SingletonObject
的实例。如果发生这种情况,您的Singleton模式就会崩溃。
在任何方式上放宽构造函数的访问修饰符 - 使其受到保护,公共或默认 - 是实例生成的开放门户,而在Singleton实现中则不是这样。