关于将构造函数说明符从private更改为受保护的singleton

时间:2013-02-20 16:56:54

标签: java design-patterns

如果我们将单例的构造函数从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

2 个答案:

答案 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实现中则不是这样。