Java 关于将构造函数说明符从private更改为singleton的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());

如果我们将单例的构造函数从private更改为protected,会发生什么?在这种情况下,我们如何防止它破裂

单身人士:

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
在package
xyz
中,我们可以在package
xyz
中创建另一个类,该类可以创建所需数量的
SingletonObject
实例。因此,使用
protected
构造函数,
SingletonObject
无法再确保任何时候只有一个实例。protected将构造函数公开给子类,而不是同一个包中的类。实际上,它是这样做的。试试看。正如我在上面的回答中所评论的,如果不在同一个包中,子类就不能实例化该类。然而,由于子类本身可能被实例化,这也可以被认为是单例的破坏。一个子类只能实例化“单例”类,如果它在同一个包中。但是,另一个包中的子类可以自己实例化。我们不知道这一点。回答固定xD