-1

私は以下のクラスを1つ持っています..

public class DataBaseDAO { 
    private DataBaseDAO() { }
        public static synchronized DataBaseDAO getInstance() {
            if (dao == null) {
                dao = new DataBaseDAO();
                }
            return dao;
            }
        }
    }

この getinstance() メソッドをハッキングできるようになりました。つまり、このシングルトンをハッキングして、より多くのオブジェクトを作成することができます。

これを安全にするにはどうすればよいですか?
これは、リフレクション、クラスローダー、デシリアライゼーションによって破ることができます。
メソッド全体に同期を設定するのではなく、同期ブロックを使用する必要がありますか?
パフォーマンスに影響を与えますか?

ありがとう、実際には新しい列挙型を導入したくありません。既存の構造では多くの変更が行われるためです。クラス自体の現在のアプローチで既存のシングルトンを改善する方法を探していました..!!

4

4 に答える 4

2

と同じことをより安全に行うことができます

public enum DataBaseDAO { 
    INSTANCE
}

たとえば、リフレクションを使用してプライベート コンストラクターを使用できsetAccessible(true)ますが、新しい列挙型インスタンスを作成することはできません。

それ以外の

DataBaseDAO.getInstance().whateverMethod()

あなたが使用することができます

DataBaseDAO.INSTANCE.whateverMethod()
于 2012-08-08T15:20:52.390 に答える
1

実際には、シングルトンがハッキングされることを心配する必要はありません。一般に、シングルトンは悪い(時代遅れの)設計手法と見なされます(シングルトンは、息子以降の邪魔になり、スケーラビリティの問題を引き起こし、テストを不必要に複雑にする傾向があります)。

あなたは明確なアクセス方法を定義しましたが、賢いハッカーがあなたのシングルトンを悪用するのを防ぐのはあなたの責任ではありません(デザイナーまたはプログラマーとして)。これを防ぐためのプロジェクトガイドラインがあります。

于 2012-08-08T15:25:41.927 に答える
0

ダブルチェックロックで使用する必要があります。シングルトンパターン はこのリンクをチェックします。

http://www.ibm.com/developerworks/java/library/j-dcl/index.html

http://onjavahell.blogspot.co.il/2009/04/uses-of-singleton-design-pattern-in.html

于 2012-08-08T15:13:23.513 に答える
0

次の 3 つのアプローチはすべて安全です。最初の 2 つはクラス ローディング メカニズムを使用し、最後の 1 つは同期を使用します。

また、SecurityManagers を使用しない限り、Reflection から身を守ることはできません。これはかなり複雑だと思います。

別の注意: シングルトンを使用しないでください ;-P

class YourClass
{
    public static final YourClass instance = new YourClass();
}

// or

class YourClass2
{
    private static final YourClass2 instance = new YourClass2();

    public static synchronized YourClass2 getInstance()
    {
        return instance;
    }
}

// or

class YourClass3
{
    private static YourClass3 instance;

    public static synchronized YourClass3 getInstance()
    {
        if (instance == null)
            instance = new YourClass3();
        return instance;
    }
}
于 2012-08-08T15:18:29.790 に答える