シングルトン: リフレクションによるインスタンスの作成を停止する方法 質問する

シングルトン: リフレクションによるインスタンスの作成を停止する方法 質問する

newJava では、、、clone()によってクラスのインスタンスを作成できることは知っていますReflectionserializing and de-serializing

シングルトンを実装する単純なクラスを作成しました。

そして、クラスのインスタンスを作成する方法をすべて停止する必要があります。

public class Singleton implements Serializable{
    private static final long serialVersionUID = 3119105548371608200L;
    private static final Singleton singleton = new Singleton();
    private Singleton() { }
    public static Singleton getInstance(){
        return singleton;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException("Cloning of this class is not allowed"); 
    }
    protected Object readResolve() {
        return singleton;
    }
    //-----> This is my implementation to stop it but Its not working. :(
    public Object newInstance() throws InstantiationException {
        throw new InstantiationError( "Creating of this object is not allowed." );
    }
}

newこのクラスでは、、clone()およびによってクラス インスタンスを停止できましたserializationが、リフレクションによって停止することはできません。

オブジェクトを作成するためのコードは

try {
    Class<Singleton> singletonClass = (Class<Singleton>) Class.forName("test.singleton.Singleton");
    Singleton singletonReflection = singletonClass.newInstance();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (InstantiationException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}

ベストアンサー1

プライベートコンストラクタ内に以下のチェックを追加することで

private Singleton() {
    if( singleton != null ) {
        throw new InstantiationError( "Creating of this object is not allowed." );
    }
}

おすすめ記事