261

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

例えば:

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

GoogleまたはSOで「static final logger」を検索するだけで、これが表示されます。

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

4

11 に答える 11

334

ロガー参照は定数ではなく、最終的な参照であり、大文字であってはなりません。定数 VALUE は大文字にする必要があります。

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

private static final double MY_CONSTANT = 0.0;
于 2009-09-13T08:40:32.637 に答える
257

クランチドッグの答えにさらに価値を加えるために、Javaコーディングスタイルガイドは、3.3項のフィールドネーミングでこれを述べています。

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

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

例:

MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME

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

于 2012-08-22T09:05:01.683 に答える
49

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

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

要約すると、constant == static finalに加えて、それが参照(単純型ではない)の場合、不変性。

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

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

上記のリンク先のslf4jjavadocsページには、「LOGGER」ではなく「logger」を使用する例があることに注意してください。

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

于 2012-03-01T03:44:44.690 に答える
44

Google の考え方が好きです ( Google Java Style )

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

例:

// 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"};
于 2015-06-11T19:07:11.130 に答える
10

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

Sun Java の規則では、public static 定数は大文字です。明らかに、ロガーは定数ではありませんが、変更可能なものを表します (そうでなければ、何かが起こることを期待してメソッドを呼び出す意味がありません)。定数ではない final フィールドに関する特定の基準はありません。

于 2009-09-13T08:31:49.223 に答える
7

これをググると、場合によってはロガーが static final として定義されていないことがわかるかもしれません。これに簡単なコピーアンドペーストを追加すると、これで説明できるかもしれません。

すべてのコードで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);
    }

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

厳密な規則により、生産性が向上し、コード テンプレートとの一貫性が保たれます

于 2009-09-13T09:02:05.020 に答える
6

個人的には大文字だとかなり大きく見えると思います。また、クラスの振る舞いとは直接関係のないクラスなので、logger代わりに使っても大きな問題はないと思いますLOGGER。ただし、厳密にペダンティックになる場合は、を使用してLOGGERください。

于 2009-09-13T08:27:29.493 に答える
2

コーディング標準がある場合は、大文字にする必要があると言う場合は、はい。

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

ところで:私は「ロガー」の方が好きです;-)

于 2009-09-13T13:02:35.163 に答える