9

Java列挙型でシングルトンを実装しようとしています。

しかし、コンストラクターが初めて初期化されるときに、いくつかのパラメーターをコンストラクターに渡したいとも考えています。

どうすればそれを達成できますか?パラメータ付きのシングルトンを持つことは良い習慣ですか?

public enum DaoManager {
    INSTANCE;
    private static ILog logger; //for passing the logger;
    private static DatabasePool pool; //passing the Database pool

    public void init(ILog logger, DatabasePool pool){
          this.logger = logger;
          this.pool = pool;   
    }

 }

現在、init メソッドを使用してロガーとデータベース プールを DaoManager に渡しています。

しかし、クライアントが init() メソッドの呼び出しに失敗すると、失敗する可能性が高くなります。

誰かがこれを行う方法を教えてもらえますか?

4

3 に答える 3

6

検討 :

public enum DaoManager {
    INSTANCE(FooManager.getLogger(), BarManager.getDataBasePool());
    private static ILog logger; //for passing the logger;
    private static DatabasePool pool; //passing the Database pool

    private DaoManager (ILog logger, DatabasePool pool){
          this.logger = logger;
          this.pool = pool;   
    }

 }

列挙型の優れた点は、それらがクラスに似ていることです。

于 2013-01-29T06:19:01.917 に答える
0

initメソッドをプライベートにすることはできますか?

オブジェクトを有効な状態にするために必要なある種の初期化ロジックがある場合。次に、オブジェクトが要求されたときにこれを行うファクトリが必要です。

持っているのstatic initは悪いデザインです。

ところで、シングルトンを使用することは、テストのアンチパターンです。グローバル状態になると、オブジェクトのテストが困難になります。

コンストラクターを制限するのではなく、オブジェクトを小さな「s」でシングルトンにする必要があります。ある種のコンテキストオブジェクトを使用して、のアプリケーション全体の単一インスタンスにアクセスしますDaoManager

applicationContext.getDaoManager()
于 2013-01-29T06:22:49.647 に答える
0
public static enum DaoManager {
    INSTANCE;
    private static ILog logger; //for passing the logger;
    private static DatabasePool pool; //passing the Database pool

    public void init(ILog logger, DatabasePool pool){
          this.logger = logger;
          this.pool = pool;   
    }

 }
于 2013-01-29T06:19:12.013 に答える