13

シングルトンを使用すると、そのインスタンスを 1 つだけ作成できます。そのインスタンスを破棄する必要はありますか?

JDBC接続とクエリ操作を管理するシングルトンDBManagerがあります。静的な newInstance メソッドを呼び出すことで、そのインスタンスを取得し、いくつかのクエリを実行します。最後に、データベース接続を閉じたいので、別の静的メソッド close を呼び出して JDBC 接続を閉じます。

DBManager のインスタンスはまだ生きていますが、役に立たない間、接続は閉じられました。たとえばnullに割り当てるなどして破棄する必要がありますか? そうしないと、後で誤って参照される可能性があります。

そのインスタンスに null を割り当ててから、newInstance メソッドを再度呼び出すと、別の新しい別のインスタンスが取得されますか?

4

8 に答える 8

10

「シングルトン」のセマンティクスにとらわれるつもりはありません。あなたの要件は、 のインスタンスが常に 1 つだけDBManager存在することです。そのインスタンスが役に立たなくなったら、それを破棄して新しいインスタンスがオンデマンドで作成されるようにするか、newInstanceメソッドを定義して (名前を変更することをお勧めします) 、シングルトンの後に呼び出された場合にgetInstance例外 (おそらく) をスローします。IllegalStateException役に立たなくなった。

役に立たなくなったときに破棄する場合は、外部の助けを借りずに、シングルトン クラス内で自動的に実行することをお勧めします。また、シングルトンDBManagerを完全に非表示にして、代わりに委任パターンを実装することも検討する必要があります。これにより、クライアントが古いDBManagerインスタンスへの参照を保持するという問題が回避されます。その後、デリゲート オブジェクトを通常のシングルトンにすることができます。

于 2011-03-17T16:55:50.290 に答える
5

いいえ、シングルトンを破棄することはできません。常に利用可能なインスタンスが1つだけである必要があるためです。そして、間違いなく同じインスタンスである必要があります。そうでない場合、実際にはシングルトンではないためです(たとえば、2つの異なるクラスがクラスの個別のインスタンスへの参照を保持する可能性があります)。

しかし、ちなみに、これは、シングルトンパターンが実際のソフトウェアではほとんどまたはまったく役に立たないと私が信じる多くの理由の1つです。すべての状況で、人々がコンストラクターを呼び出さないようにすることでこれを強制するまで、正確に1つのことを望んでいる可能性は非常に厳格です。これは、ある時点ではシングルトンを持つことが合理的であるように見えた状況のように聞こえますが、複数のインスタンスが理にかなっていることが明らかになりました。

それで、これがシングルトンでなければならないかどうかを考えてください-必要に応じて配線された接続のラッパーにすることができますか?

于 2011-03-17T16:50:12.940 に答える
2

DBManager自体を実際に破壊することなく、DBManagerが接続を開いたり閉じたりできるようにすることは、シングルトンパターンに沿ったものになると思います。次にデータベース接続が必要になるまでそれを保持し、同じDBManagerオブジェクトに新しい接続を作成するように依頼します。結局のところ、それがDBManagerの場合、接続を管理します。個々の接続を表すものではありません。

于 2011-03-17T16:50:49.257 に答える
2

このような場合、接続プーリング メカニズムを利用します。データベースにクエリを実行する各操作では、接続を開いたり閉じたりする必要があります。ただし、接続プールを使用しているため、接続は物理的に閉じられるのではなく、プールに返されます。

プールには と呼ばれるIDLE_CONNECTION_TIMEOUT、または同様の設定があり、構成された期間使用されていない場合、接続は自動的に期限切れになり、閉じられます。そのため、このような場合に開発者が心配することはほとんどありません。

于 2011-03-17T16:51:22.803 に答える
0

データベース接続が閉じられている場合、DBManager クラスはクリーンアップを処理する必要があります。つまり、DBManager が Connection クラスへの参照を持っている場合、newInstance() メソッドにコードを記述して、接続が有効かどうかを確認し、静的参照を返すことができます。このようなもの:

static DBManager manager;
static DBManager newInstance(){
if (manager == null) manager =new DBManager();
else if ( manager !=null && connection ==null) //if connection is closed 
manager =new DBManager();

return manager;
}
于 2011-03-17T17:00:46.080 に答える
0

簡単な答え: いいえ。

より長い答え: 特別なクラスローダーを使用しない限り、シングルトンを破棄することはできません。破棄する必要がある場合は、シングルトンを使用しないでください。たぶん、それを再オープンする方法で書き直すことができます-より良い:シングルトンパターンを避けてください。

アンチパターンまたはコードの匂いを検索します。

于 2011-03-17T16:55:38.727 に答える
0

答えは、シングルトンは 1 つだけであるため、シングルトンを破棄することはできませんあなたの問題に関しては、HASA接続が閉じられて役に立たなくなるDBManagerクラスがあります。

あなたの目的は、一度に 1 つの DB 接続を開くことだと思うので、ここでコードを見て、単一の責任プリンシパルを壊し、接続の責任を別のクラスに分割し、接続を管理する権限をシングルに許可します。つまり、必要に応じて接続を閉じて再度開きます。

于 2011-03-17T17:02:32.943 に答える
-1

クラス Variable の getter/setter を作成し、それを null に設定して、オブジェクトを再インスタンス化します。例:

//Singleton support ...
private static A singleton = null;
    public static A get() {
        if (singleton == null){
        singleton = new A();
    }
        return singleton;
}
public static A getSingleton() {
    return singleton;
}
public static void setSingleton(A singleton) {
    A.singleton = singleton;
}

//Re instantiate 
public class Test(){
....
....
    A.setSingleton(null);

}
于 2012-05-16T19:10:25.887 に答える