2012-03-21 5 views
0

Loggerクラスを実装していましたが、奇妙な理由でコンストラクターメソッドが呼び出されません。他のクラスでは、SRCLogger.getLogger().log(Level.INFO, "Message");を使用すると、パスにログファイルが作成されません。ロガーを作成するときにコンストラクターが呼び出されない

私には何が欠けていますか?このコードの何が間違っていますか?

は、ここに私のコードです:簡単に言えば、事前

答えて

4

public final class SRCLogger implements Serializable{ 

    private static final Logger l = Logger.getLogger("mySRCLogger"); 
    private FileHandler fh; 

    private String ROOT_DIR = "C:\\Users\\Test\\Desktop\\"; 

    public SRCLogger(){ 
     System.out.println("Constructor."); 
     try { 
      fh = new FileHandler(ROOT_DIR + "SRCLog.log"); 
      fh.setFormatter(new SimpleFormatter()); 
      l.addHandler(fh); 
      System.out.println("Try."); 
     } catch (IOException ex) { 
      Logger.getLogger(SRCLogger.class.getName()).log(Level.SEVERE, null, ex); 
      System.out.println("Catch IOException."); 
     } catch (SecurityException ex) { 
      Logger.getLogger(SRCLogger.class.getName()).log(Level.SEVERE, null, ex); 
      System.out.println("Catch SecurityException."); 
     } 
    } 

    public static Logger getLogger(){ 
     return l; 
    } 
} 

乾杯のおかげ - あなたはコンストラクタを呼び出すんじゃないんです。あなたはこれを呼んでいる:

public static Logger getLogger(){ 
    return l; 
} 

... lを返し、次のように初期化され、静的フィールド:

private static final Logger l = Logger.getLogger("mySRCLogger"); 

あなたはそれがインスタンス化されるクラスをトリガするために期待するのはなぜ?あなたがインスタンスメソッドを持たないという事実も、デザインの匂いです。既存のロガーにハンドラを追加する以外に、クラスが達成すると思われるものは何ですか?それだけでいいのであれば、私はあなたのクラスを静的メソッドに変えることができます。私が知る限り、インスタンスは実際には必要ありません。

+0

したがって、ロガーにハンドラが必要な場合は、そのハンドラのコードをコンストラクタではなく静的メソッドに入れる必要がありますか? – BRabbit27

+0

@ BRabbit27:あなたは*ハンドラ*を書いていません。あなたは単にFileHandlerを作成しています。そのハンドラをロガーに追加するコードは、静的メソッドにすることができます。 –

+0

あなたはコンストラクタでやっているすべてのタスクを行うべき静的メソッド 'private static init()'を持つべきです。 'init'が呼び出された場合、ブール値フラグを保持することができます。 'getLogger()'では 'false'の場合はそのフラグをチェックし、' init'を呼び出す場合はそうでなければ –

0

コンストラクタを呼び出すには、オブジェクトを "new"キーワードを使用してインスタンス化する必要があります。クラスの静的メソッド(オブジェクトではない)だけを呼び出すと、コンストラクターは呼び出されません。

ので

SRCLogger.getLogger() 

が呼び出される静的なメソッドです。

あなたは

new SRCLogger().getLogger() 

ような何かを行う場合は、コンストラクタが呼び出されますが、オブジェクトインスタンス上の静的メソッドを呼び出すことをお勧めではありません。静的メソッドは、クラス自体で呼び出される必要があります。

関連する問題