0

シングルトンのコンストラクターを 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 には、他の方法でシングルトンをクラッキングするために必要な情報が含まれています。

4

2 に答える 2

1

簡単: コンストラクタ アクセス修飾子を からprivateに変更するprotectedと、同じパッケージ内の任意のクラスをインスタンス化できますSingletonObjectpackage対応するステートメントを指定することで、「同じパッケージ内に」クラスを簡単に作成できます。

編集:protectedカルロスの答えは、コンストラクターを作成することとは対照的に、コンストラクターを作成することから生じる追加の問題を認識させましたpublic。シングルトン クラス自体は、インスタンス (または 1 つのインスタンス) が作成される場所と方法を完全に制御できなくなります。

于 2013-02-20T17:25:22.063 に答える
1

Joshua Bloch のシングルトン プロパティの効果的な Javaから:

プライベート コンストラクターは、public static final フィールド (...) を初期化するために 1 回だけ呼び出されます。パブリック コンストラクターまたはプロテクト コンストラクターがないため、"単一インスタンス" ユニバースが保証されます。Singletonクラスが初期化されると、正確に 1 つの (...) インスタンスが存在します。それ以上でもそれ以下でもありません。クライアントがこれを変更することはできません。

したがって、Singleton Constructor を保護する場合、Constructor を公開して、同じパッケージ内の任意のクラスでインスタンスを のインスタンスにできるようにしますSingletonObject。その場合、シングルトン パターンが壊れています。

コンストラクターのアクセス修飾子を保護、パブリック、またはデフォルトにするなど、何らかの方法で緩和することは、インスタンス生成への扉を開くことであり、シングルトン実装では望ましくありません。

于 2013-02-20T17:41:50.070 に答える