これを行う理由はありますか?
private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
これの代わりに?
private static Logger logger = LoggerFactory.getLogger(Main.class);
構文上の利点がお互いに何であるかを私は理解していません。どちらも正常に機能しているようです。
定数の名前はすべて大文字であるというのは、C /C++の世界から受け継がれた規則です。Javaでは、定数に最も近いものはであるためstatic final
、これらのメンバーは同じように名前が付けられることがよくあります。
この場合、ロガーオブジェクトは意味的に定数ではないため、区別はそれほど重要ではない可能性があります。それでも、static
クラスごとに1つのインスタンスがあることを確認するために宣言することをお勧めします。final
また、オブジェクトへの参照を後で変更できないようにするために宣言することもできます(そして、この事実を読者に伝えるために)。コード)。
@Moncaderのコメントへの更新:
static
はC++(クラス)と同等ですstatic
-定数を非静的として宣言することはC ++ではあまり意味がないだけでなく、Javaでも意味がありません。
final
C++と直接同等ではありませんconst
。これは、問題の参照を変更できないことを意味します。ただし、参照されるオブジェクトの変更を妨げることはありません。int
したがって、プリミティブ値(eg )または不変オブジェクトへの参照(eg)を保護する場合にのみconstとして機能しますString
。私たちの現在のトピックにとどまるために、考慮してください
private static final Logger logger = LoggerFactory.getLogger(Main.class); ... logger.setLevel(Level.INFO); logger.addAppender(...); logger.setAdditivity(false);
これらの呼び出しはすべて、宣言されていても、明らかにロガーの状態を変更していますfinal
。これは、ロガーオブジェクトが意味的に定数ではないことを示すことによって上記で意味したことです。
なぜそれを最終的にするのですか?
これにより、現在のロガーを誰も変更できないことが確実になります。
なぜロガーではなくロガーなのか?
これはJavaの慣習です。定数は大文字で名前が付けられます。
クラス定数として宣言された変数およびANSI定数の名前は、すべて大文字で、単語をアンダースコア( "_")で区切る必要があります。(デバッグを容易にするために、ANSI定数は避ける必要があります。)
資力 :
final
他のものを指すように参照を変更できないことを意味します。
大文字は、これが静的クラス定数であることを読者に示唆する単なるコーディング規約です。特に、参照するときに短いクラス名を前に付ける場合(たとえばFoo.LOGGER.info("message");
)、1999年のSunJavaコーディング規約を参照してください。
一部の(すべてではない)Java VMは、最終定数を最適化して、ロガーへのアクセスを高速化します。したがって、プログラム内のどこかの値が決して変更されない場合は、それを最終的なものにします。
LOGGERは、Javaの人々が定数に対して行うことです。本当に小文字にしたい場合は、パフォーマンスやプログラムの面で違いはありません。
機能的な違いはありません。最初の例では、ロガーは定数であり、変更することはできません。定数にすべて大文字を使用するのはJavaの規則です。2番目の例では、ロガーは静的ですが最終的なものではないため、呼び出し元のコードによって変更できます。あなたはおそらくそれを望まないので、私は最初のオプションを使用します。