Javaロガー:静的ブロックの初期化または変数宣言での初期化


15

現在、私のプロジェクトでは次の方法でロガーを使用しています。

private static final Logger LOGGER;

static{
  LOGGER = logger.getLogger();
}

静的ブロックを使用してロガー変数を初期化するためのコードレビューを受けました。宣言文自体でロガー変数を初期化するように言われました。

private static final Logger LOGGER = Logger.getLogger();

静的ブロックで初期化しないと、どのような違いが生じるかを把握しようとしています。これが実践かどうか知りたい。


8
違いはありませんが、そのうちの1つはより多くの入力とコードの行を必要とします。
user253751

どちらもまったく同じバイトコードを生成します。どちらを好むかは完全に好みの問題です。
user20742117

ロンボクを使用してみませんか?
モニカの復職-M.シュレーダー

回答:


48

イニシャライザのシーケンスを含むいくつかの本当に奇妙なコーナーケースを除いて、2つの選択肢はまったく同じように機能します。

ただし、宣言でインスタンスを直接初期化する方が短く、より馴染みがあるため、その理由だけで優先されるべきです。

静的初期化ブロックはやや特殊な構成であり、例外を処理する必要がある場合など、実際に付加価値を提供する場合にのみ使用してください。


7
静的ブロックを使用するまれなケースとして例外に言及するのは良い点です。
user949300

4
HashMapの初期化は、もう1つの優れたユースケースです。
ラバーダック

3
@RubberDuck Java 9のMap.ofメソッドはこれに役立つはずです。
-cbojar

1
Map.ofただし、@ cbojar は不変のマップを返します。したがって、実際に必要なHashMap場合は、古い方法で行う必要があります。または何かnew HashMap(Map.of(...))
カペックス

1
@Kapepはい、それを使用してコンストラクターに渡すのは、初期化ブロックの代わりに可変マップが必要な場合の方法です。
cbojar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.