ここに私が決定しようとしているのは...共用の静的メソッドとインスタンスメソッド
私は、テキストファイルに行を追加するユーティリティクラスを持っています。 共通のログファイルである のような他の多くのクラスで使用する必要があります。
私の最初の実装では、すべてのクラスがありました リファレンス不要のインスタンスを作成したいと思っていました。
new Logger(logline,logname);
コンストラクタはPrintWriter
を作成し、ライン を追加し、ファイルを閉じます。
これは、すべての行が追加された の新しいインスタンスが作成されるため、無駄に思えました。
代替は、私は、静的 メソッドとデータがオーバー&上で同じメモリを再利用することを理解していたことから、この共通のクラスで「のwriteln」 という静的メソッドを、使用していた...しかし
この静的メソッドは、PrintWriter
のインスタンスを作成してジョブを実行します。つまり、#1のように、すべての行に対してPrintWriter
の新しいインスタンス が作成されるわけではありません。とにかく
、(私はJavaへの比較的新しいです)これを行うの よく知られ、承認された方法があるか、我々はわずかの距離の作成、およびガベージコレクタ は、私たちの後にクリーンアップしましょう のですか?
ありがとうございました
ありがとう、クリス!これは、私と一緒に を共鳴させた提案でした。 2つのログファイルがあります.1つは通常の ロギング用で、もう1つはエラー用です。したがって、 HashMap(ディスパッチテーブル)への参照を保持することは素晴らしいことです。キーはファイル名にすることができます。 私が捕まえなかったことの1つ。 ロギングターゲットのクローズについて...ファイルは各行の後で閉じられます。 メモリも解放する必要がありますか? JVM が終了すると(プログラム終了時に)これが起こったと思います。 – javaphild
各ログ行のログファイルを閉じると、各ログ行に対して再度開く必要があります。これは重大なパフォーマンスヒットになるでしょう。ログデータがディスクにヒットすることを目的とする場合は、flush()を使用することを検討する必要があります。パフォーマンスペナルティはまだありますが、それほど多くはありません。 しかし、すべての行の後にファイルを閉じることを依頼している場合は、別の場所でファイルを閉じることについて心配する必要はありません。地図は自動的に解放されたままにすることができます。 –
ファイル名をキーとして使用すると、クライアントが直接文字列リテラルではなく文字列定数フィールドのみを使用してファイル名を参照する限り、問題ありません。これにより、タイプミスの影響を減らすことができます。つまり、ファイル名が1か所に保存されているため、必要に応じて簡単に変更できます。 –