1. ホーム
  2. java

[解決済み] loggerはprivate staticであるべきか、そうでないのか

2022-11-01 15:19:48

質問

loggerはstaticで宣言すべきでしょうか?通常、ロガーに対して2種類の宣言があるのを見たことがあります。

    protected Log log = new Log4JLogger(aClass.class);

または

    private static Log log = new Log4JLogger(aClass.class);

どちらを使うべきですか? 両者の長所と短所は何ですか?

どのように解決するのですか?

非静的形式の利点は、正しいクラス名が使われるかどうか心配することなく、以下のように(抽象)基底クラスで宣言できることです。

protected Log log = new Log4JLogger(getClass());

しかし、その欠点は明らかに、クラスのインスタンスごとに全く新しいロガーインスタンスが作成されることです。これはそれ自体高価ではないかもしれませんが、かなりのオーバーヘッドを追加します。これを避けたい場合は static という形式を使うのがいいでしょう。しかし、その欠点は、個々のクラスでそれを宣言しなければならないことと、 ロガーの構築時に正しいクラス名を使用するようにすべてのクラスで気をつけなければならないことです。 getClass() は静的なコンテキストでは使用できないからです。しかし、一般的なIDEでは、このためのオートコンプリートテンプレートを作成することができます。例えば logger + ctrl+space .

一方、順番にすでにインスタンス化されたロガーをキャッシュするかもしれないファクトリーによってロガーを得るならば、非静的なフォームを使うことは、それほどオーバーヘッドを追加しません。例えば、Log4jは LogManager があります。

protected Log log = LogManager.getLogger(getClass());