2

Apache ロガー静的オブジェクトを定義するこの親抽象クラスがあります。このようなもの:

import org.apache.log4j.Logger;

public abstract class A {

    private final static Logger logger;

        (...)

}

ロガー オブジェクトが初期化されていないため、このコードが違法であることはわかっています。問題は、 logger = Logger.getLogger(A.class); で初期化したくないことです。各子クラスを独自のクラス オブジェクトで初期化する必要があるため、どのクラスがどのエラーを引き起こしたかを知ることができます。

しかし同時に、基本クラス A にいくつかのロギング メソッドを含めたいと考えています。

これのベストプラクティスは何ですか?A.class で初期化してから、子クラスごとに再インスタンス化する必要がありますか? どういうわけか、それは私には間違っているように感じます。

4

2 に答える 2

2

作成された実際のクラスで初期化します。

logger = Logger.getLogger(getClass()); //log4j way of creating loggers

これを行うには、宣言staticから修飾子を削除する必要があります。私はそれを保持し、getter メソッドを介してアクセスするloggerことを好みますが、それを作成してサブクラスから直接アクセスすることもできます。privateprotectedA

多くのロガー オブジェクトが作成され、クラス インスタンスごとに 1 つのロガーが作成されることを心配する必要はありません。Logger内部にはロガーのマップが含まれており、新しいロガーを作成するたびにキャッシュされます。同じクラスの logger を 2 回目に取得しようとすると、内部マップから取得されます。

したがって、階層に 5 つのクラスがある場合、 をLogger何回呼び出しても、作成されるオブジェクトは5 つだけですgetLogger(getClass())

于 2012-07-18T15:31:30.390 に答える
0

A.class で初期化してから、子オブジェクトごとに再インスタンス化する必要がありますか?

子クラスごとに再インスタンス化する必要があります。

于 2012-07-18T15:31:34.777 に答える