0

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

单身人士:

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 包含使用其他方式破解单例所需的信息。

4

2 回答 2

1

简单:将构造函数访问修饰符从更改privateprotected允许同一包中的任何类实例化SingletonObjectpackage通过指定相应的语句,我们可以很容易地创建一个“在同一个包中”的类。

编辑: Carlos 的回答让我意识到了一个额外的问题,它是由构造函数protected而不是public:可以创建单例类的子类(在另一个包中),它可以自由实例化并调用其实例方法;单例类本身不再完全控制创建实例(或 1 个实例)的位置和方式。

于 2013-02-20T17:25:22.063 回答
1

来自Joshua Bloch 的 Effective Java on Singletons Properties:

私有构造函数只被调用一次,以初始化公共静态最终字段 (...)。缺少公共或受保护的构造函数保证了一个“<em>monoinstance”宇宙:一旦Singleton类被初始化,就只有一个 (...) 实例存在——不多也不少。客户所做的任何事情都无法改变这一点。

所以,如果你让你的单例构造函数受到保护,你就会暴露你的构造函数,让同一个包中的任何类都可以将实例作为SingletonObject. 如果发生这种情况,您的单例模式将被破坏。

以任何方式放宽构造函数的访问修饰符——使其成为受保护的、公共的或默认的——是实例生成的敞开大门,这在单例实现中是不希望的。

于 2013-02-20T17:41:50.070 回答