web-dev-qa-db-ja.com

「静的最終ロガー」を大文字で宣言する必要がありますか?

Javaでは、静的な最終変数は定数であり、慣例では大文字である必要があります。ただし、ほとんどの人がロガーを小文字で宣言していることを確認しました。これは PMD の違反として発生します。

例えば:

private static final Logger logger = Logger.getLogger(MyClass.class);

google 」または「 SO 」で「static final logger」を検索するだけで、自分で確認できます。

代わりにLOGGERを使用する必要がありますか?

227
dogbane

ロガー参照は定数ではなく、最終参照であり、大文字であってはなりません。定数VALUEは大文字でなければなりません。

private static final Logger logger = Logger.getLogger(MyClass.class);

private static final double MY_CONSTANT = 0.0;
284
crunchdog

Crunchdogの答えにさらに価値を加えるために、 Javaコーディングスタイルガイド には3.3フィールドの名前付けが記載されています

constantsとして使用されるフィールドの名前はすべて大文字で、単語をアンダースコアで区切る必要があります。以下は定数と見なされます。

  1. すべてのstatic finalプリミティブ型(allインターフェイスフィールドは本質的にstatic finalであることを忘れないでください)。
  2. "static final"(ドット)が後に続かないすべての.オブジェクト参照型。
  3. "static final"(ドット)が後に続かないすべての[配列。

例:

MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME

この規則に従って、loggerは、ポイント2で述べたstatic finalオブジェクト参照ですが、isに続いて ". "使用するたびに、定数と見なすことはできないため、小文字にする必要があります。

216
cbliard

効果的なJavaから、第2版、

前の規則の唯一の例外は「定数フィールド」に関するもので、その名前は、アンダースコア文字で区切られた1つ以上の大文字の単語で構成される必要があります(例:VALUESまたはNEGATIVE_INFINITY)。 定数フィールドは、値が不変の静的最終フィールドです。静的最終フィールドにプリミティブ型または不変の参照型がある場合(項目15)、それは定数フィールドです。たとえば、enum定数は定数フィールドです。 静的な最終フィールドに可変参照型がある場合、参照されるオブジェクトが不変であれば、それは定数フィールドになる可能性があります。

要約すると、constant == static final、さらに参照(単純型)の場合は不変性です。

Slf4jロガーを見ると、 http://www.slf4j.org/api/org/slf4j/Logger.html

不変です。一方、JULロガーは変更可能です。 log4jロガーも変更可能です。正確に言うと、log4jまたはJULを使用している場合は「ロガー」であり、slf4jを使用している場合はLOGGERである必要があります。

上記のリンクされたslf4j javadocsページには、「LOGGER」ではなく「logger」を使用する例があります。

もちろん、これらは単なる規則であり、規則ではありません。たまたまslf4jを使用していて、他のフレームワークから慣れているために「ロガー」を使用したい場合、または入力が簡単な場合、または読みやすくする場合は、先に進んでください。

42

Googleがそれを好む( Google Java St​​yle

すべての定数は静的な最終フィールドですが、すべての静的な最終フィールドが定数ではありません。定数のケースを選択する前に、フィールドが本当に定数のように感じるかどうかを検討してください。たとえば、そのインスタンスの観測可能な状態のいずれかが変化する可能性がある場合、ほぼ確実に一定ではありません。通常、オブジェクトを変更しないだけでは十分ではありません。

例:

// Constants
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final Joiner COMMA_JOINER = Joiner.on(',');  // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }

// Not constants
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set<String> mutableCollection = new HashSet<String>();
static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};
33
mateuscb

自動化されたツールを使用してコーディング標準を確認しており、それが上記の標準に違反している場合は、それまたは標準を修正する必要があります。外部標準を使用している場合は、コードを修正してください。

Sun Javaの規則は、パブリック静的定数の大文字です。明らかに、ロガーは一定ではありませんが、変更可能なものを表します(そうでなければ、何かが起こることを期待して、その上でメソッドを呼び出すことはできません)。定数でない最終フィールドには特定の標準はありません。

10
Pete Kirkham

これをグーグルで検索すると、場合によっては、ロガーが静的ファイナルとして定義されないことがあります。これにいくつかの簡単なコピーアンドペーストを追加してください。

すべてのコードでLOGGERを使用であり、これは命名規則に対応しています(CheckStyleはこれに満足しています)。


Eclipseの厳密な命名規則を活用して、さらに先へ進みます。次のコードテンプレートを使用して新しいクラスを作成します。

    // private static final Logger LOGGER = Logger.getLogger(${enclosing_type}.class);

最初は必要ないため、ロガーはコメント化されています。ただし、後で必要になった場合は、コメントを外してください。

次に、コードでは、このロガーが存在することを期待するコードテンプレートを使用します。 try-catchテンプレートを使用した例:

    try {
      ${cursor} or some other template
    } catch (Exception t) {
      LOGGER.error("${methodName} ${method parameters}", t);
    }

それを使用するテンプレートがいくつかあります。

厳密な規則により、コードテンプレートとの生産性と一貫性を高めることができます

7
KLE

私は個人的には大文字で本当に大きく見えると思います。さらに、これはクラスの動作に直接関係しないクラスなので、loggerの代わりにLOGGERを使用しても大きな問題は見られません。しかし、あなたが厳密にped行するつもりなら、LOGGERを使用してください。

6
João Silva

PMDがコメントを尊重することを忘れないでください

// NOPMD

初期化。これにより、PMDはそのチェックから行をスキップします。これにより、希望するスタイルを選択できます。

4
Fortyrunner

通常、定数は大文字です。

ただし、ロガーは静的である必要はありませんが、slf4jファサードを使用している場合、包含クラスのすべての「新規」を検索する必要があります。これにより、特にWebコンテナーでの厄介なクラスローダーの問題が回避され、さらに、ロガーフレームワークが呼び出しコンテキストに応じて特別な処理を実行できるようになります。

あなたのコーディング標準があれば-もしあれば-それは大文字であるべきだと言ってはい。

いずれにせよ、厳密な理由は見当たりません。私はそれがあなたの個人的な好き嫌いに完全に依存すると思う会社のコーディング標準。

ところで:私は「ロガー」を好む;-)

1
Kutzi