2

これが私が決定しようとしているものです...

テキスト ファイルに行を追加するユーティリティ クラスがあります。これは、共通のログ ファイルなど、他の多くのクラスで使用する必要があります。

私の最初の実装では、それを使用したいすべてのクラスに参照のないインスタンスを作成させました。

new Logger(logline,logname);

コンストラクターは を作成しPrintWriter、行を追加してファイルを閉じます。

追加されたすべての行に対して新しいインスタンスが作成されるため、これは無駄に思えました。

別の方法は、この共通クラスで「writeln」と呼ばれる静的メソッドを使用することでした。これは、静的メソッドとデータが同じメモリを何度も再利用することを理解していたためです...しかし

この静的メソッドは、PrintWriter ジョブを実行するためにのインスタンスを作成します。つまり、 PrintWriter#1 のように、行ごとに の新しいインスタンスが作成されるということではないでしょうか。

とにかく、(私はJavaに比較的慣れていません)これを行うためのよく知られた承認された方法はありますか?

ありがとう

4

3 に答える 3

5

賢明な答えは、 Commons Loggingなどの「本格的な」ロギング パッケージを使用することです。

ただし、質問に答えるには、この場合、静的メソッドを使用する必要があります (コードでクラス インスタンスのログ記録を維持する場合を除きます。その場合は、このスレッドの他の回答に従う必要があります)。さらに、たとえば a に初期化される静的フィールドが必要ですMap<String, PrintWriter>。(キーとして使用する必要はありませんString。有限数のログ ターゲット タイプが必要な場合は、列挙型を使用します。)

次に、メソッドがマップにまだ存在しないキーを検出するとPrintWriter、その場で を作成し、マップに貼り付けます。おそらくバッキング マップ タイプとして a を使用したいConcurrentHashMapので、スレッド セーフです。

また、ログ ターゲットを閉じる方法も提供する必要があります (これにより、関連するエントリもマップからクリアされます)。

幸運を!

于 2009-04-24T01:52:24.193 に答える
3

コンストラクターで作業を行うべきではありません。

コンストラクターは、オブジェクトのセットアップ用です。

実際のロギングを行うには、Log() メソッドを作成する必要があります。

Logger l = new Logger();
l.Log(logline,logname);
l.Log(logline,logname);

または、ロガーをシングルトンとしてセットアップできます。

Logger.getInstance().Log(logline, logname);

Java のシングルトン パターン: http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html

于 2009-04-24T01:48:56.323 に答える
2

このオブジェクト、特に PrintWriter が保持したい状態にはいくつかの種類があります。Logger クラスがこれらをインスタンス データとして格納する場合、ロギングを行うメソッドは、静的メソッドではなく、インスタンス メソッドである必要があります。したがって、ロギングを構築から分離する必要があります。

// Pass only the PrintWriter into the constructor, not the line to be logged.
Logger myLogger = new Logger(filename);

...

// Log a message
myLogger.log("This is a message to be logged.");

// Log another message, just for kicks.
myLogger.log("this shows that myLogger can be used repeatedly.");

実装の詳細は示していませんが、これで十分だと思います。

于 2009-04-24T01:52:13.257 に答える