0

私は、静的コンストラクターを使用した一種の「シングルトン」実装の既存の設計を持っています。新しいインスタンスを破棄して再作成できるようにしたい。

ベースデザインを変更せずにこれを行うことはできますか?

これは単純化されたプロトタイプです:

public static void main(String[] args) {
     ClassA.doWork();
     ClassA.destruct();

     ClassA.doWork(); // <--I need new instance here
}

public class ClassA {
    private static ClassA inst = new ClassA();
    protected ClassA() {
        //init      
    }   
    public static void doWork(){
        //do work
    }   
    public static void destruct(){
        inst = null;
    }
}
4

4 に答える 4

3

このルートをたどる決心をしていて、すべてのメソッドの null チェックが気に入らない場合は、「破棄」アプローチを「リセット」に変更できます。

    public static void reset(){
        inst = 新しい ClassA();
    }

破壊する代わりにそれを呼び出します。

しかし、真剣に、それをしないでください... この混乱をリファクタリングするために今時間を費やしてください。

于 2013-02-04T11:19:32.723 に答える
0

doWork次のようなメソッドでインスタンスを作成します。

  private static ClassA inst;
    public static void doWork() {
        if (inst == null) {
            inst = new ClassA();
        }
    }
于 2013-02-04T11:14:43.387 に答える
0

doWorkメソッドに次のコードを追加します。

public static void doWork()
{
    if(inst == null)
    {
        inst = new ClassA();
    }
    //do work
}  

また

インスタンスを作成するための別のメソッドを追加します (破棄する必要がある方法と同様)。

public static ClassA init()
{
    if(inst == null)
    {
        inst = new ClassA();
    }
    return inst;
}
于 2013-02-04T11:11:11.313 に答える
0

メソッドdoWorkはインスタンスに対してチェックし、のnullインスタンスをスローするIllegalStateExceptionか新しいインスタンスを作成しClassAてから、ロジックを実行する必要があります。

        public static void doWork(){
            if (inst == null){
                // throw new IllegalStateException("instance has been destroyed");
                // or
                inst = new ClassA();
            }
            // doWork now
        }
于 2013-02-04T11:11:39.793 に答える