Должен ли "статический финальный Logger" быть объявлен в UPPER-CASE? - PullRequest
221 голосов
/ 13 сентября 2009

В Java статические конечные переменные являются константами, и существует соглашение, что они должны быть в верхнем регистре. Тем не менее, я видел, что большинство людей объявляют регистраторы в нижнем регистре, что выглядит как нарушение в PMD .

например:

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

Просто найдите google или SO для "статического финального регистратора", и вы сами это увидите.

Должны ли мы вместо этого использовать ЛОГГЕР?

Ответы [ 10 ]

276 голосов
/ 13 сентября 2009

Ссылка регистратора не является константой, а является окончательной ссылкой и НЕ должна быть в верхнем регистре. Постоянное значение должно быть в верхнем регистре.

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

private static final double MY_CONSTANT = 0.0;
212 голосов
/ 22 августа 2012

Чтобы добавить больше значения к ответу crunchdog, в Руководстве по стилю кодирования Java говорится об этом в параграфе 3.3 Имена полей

Имена полей, используемых в качестве констант должны быть в верхнем регистре, с подчеркиванием, разделяющим слова. Следующие значения считаются постоянными:

  1. Все static final типы примитивов (Помните, что все поля интерфейса по своей природе static final).
  2. Все static final типы ссылок на объекты, за которыми никогда не следует "." (точка).
  3. Все static final массивы, за которыми никогда не следует "[" (точка).

Примеры:

MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME

В соответствии с этим соглашением, logger является ссылкой на объект static final, как указано в пункте 2, но, поскольку за стоит , за которым следует "." каждый раз, когда вы его используете, его нельзя считать как константа и, следовательно, должны быть в нижнем регистре.

42 голосов
/ 01 марта 2012

Из эффективной Java, 2-е изд.,

Единственное исключение из предыдущего правила касается «постоянных полей» чьи имена должны состоять из одного или нескольких заглавных слов, разделенных символ подчеркивания, например, VALUES или NEGATIVE_INFINITY. A постоянное поле - это статическое конечное поле, значение которого является неизменным . Если статическое конечное поле имеет примитивный тип или неизменный ссылочный тип (Пункт 15), то это постоянное поле. Например, константы перечисления постоянные поля. Если статическое конечное поле имеет изменяемую ссылку тип, он все еще может быть константным полем, если ссылка на объект неизменны.

В общем, константа == статический финал, плюс, если это ссылка (по сравнению с простым типом), неизменность.

Глядя на регистратор slf4j, http://www.slf4j.org/api/org/slf4j/Logger.html

Он неизменен. С другой стороны, регистратор JUL изменчив. Log4j logger также изменчив. Таким образом, чтобы быть правильным, если вы используете log4j или JUL, это должен быть «logger», а если вы используете slf4j, это должен быть LOGGER.

Обратите внимание, что на странице javadocs slf4j, на которой есть ссылка, есть пример, в котором они используют "logger", а не "LOGGER".

Это, конечно, только условные обозначения, а не правила. Если вам случается использовать slf4j и вы хотите использовать «регистратор», потому что вы привыкли к этому из других платформ, или если его легче набирать, или для удобства чтения, продолжайте.

32 голосов
/ 11 июня 2015

Мне нравится, как Google это воспринимает ( Google Java Style )

Каждая константа является статическим конечным полем, но не все статические конечные поля являются константами. Прежде чем выбрать постоянный регистр, подумайте, действительно ли поле ощущается как константа. Например, если какое-либо наблюдаемое состояние этого экземпляра может измениться, оно почти наверняка не является константой. Простого намерения никогда не мутировать объект, как правило, недостаточно.

Примеры:

// 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"};
10 голосов
/ 13 сентября 2009

Если вы используете автоматизированный инструмент для проверки ваших стандартов кодирования, и он нарушает указанные стандарты, то его или стандарты должны быть исправлены. Если вы используете внешний стандарт, исправьте код.

Соглашение в Sun Java является прописными для открытых статических констант. Очевидно, что логгер не является константой, но представляет изменяемую вещь (иначе не было бы смысла вызывать методы для него в надежде, что что-то случится); не существует специального стандарта для непостоянных конечных полей.

7 голосов
/ 13 сентября 2009

Если вы гуглите это, вы можете обнаружить, что в некоторых случаях регистраторы не определяются как статические окончательные. Добавьте к этому быстрое копирование и вставку, и это может объяснить это.

Мы используем 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);
    }

У нас есть еще несколько шаблонов, которые его используют.

Строгое соглашение позволяет нам быть более продуктивными и согласованными с шаблонами кода .

6 голосов
/ 13 сентября 2009

Лично я думаю, что в верхнем регистре это выглядит действительно большим. Более того, поскольку это класс, который не имеет прямого отношения к поведению класса, я не вижу большой проблемы в использовании logger вместо LOGGER. Но если вы собираетесь быть строго педантичным, тогда используйте LOGGER.

4 голосов
/ 14 сентября 2009

Не забывайте, что PMD будет уважать комментарий с

// NOPMD

в нем. Это заставит PMD пропустить строку из своих проверок, это позволит вам выбрать любой стиль, который вы хотите.

3 голосов
/ 13 сентября 2009

Обычно константы в верхнем регистре.

Регистраторы, однако, не должны быть статичными, а должны искать все «новые» класса, если они используют фасад slf4j. Это позволяет избежать некоторых неприятных проблем с загрузчиком классов, особенно в веб-контейнерах, а также позволяет каркасу ведения журналов выполнять специальные действия в зависимости от контекста вызова.

1 голос
/ 13 сентября 2009

Если ваши стандарты кодирования - если они есть - скажите, что они должны быть прописными, тогда да.

Я не вижу строгой причины, так или иначе. Я думаю, что это полностью зависит от ваших личных симпатий, соответственно. стандарты кодирования вашей компании.

Кстати: я предпочитаю "LOGGER"; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...