Должен ли быть объявлен "статический конечный регистратор" в ВЕРХНЕЙ ЧАСТИ? - программирование
Подтвердить что ты не робот

Должен ли быть объявлен "статический конечный регистратор" в ВЕРХНЕЙ ЧАСТИ?

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

например:

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

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

Следует ли вместо этого использовать LOGGER?

4b9b3361

Ответ 1

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

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

private static final double MY_CONSTANT = 0.0;

Ответ 2

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

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

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

Примеры:

MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME

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

Ответ 3

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

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

Таким образом, константа == static final, плюс, если это ссылка (по сравнению с простым типом), неизменность.

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

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

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

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

Ответ 4

Мне нравится, что Google использует его (Стиль Google Java)

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

Примеры:

// 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"};

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 8

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

// NOPMD

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

Ответ 9

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

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

Ответ 10

Не обязательно. Прочитайте это - Соглашения об именах

РЕЗЮМЕ: имена переменных объявленные константы классов и ANSI константы должны быть в верхнем регистре с слова, разделенные символами подчеркивания ( "_" ).

Ответ 11

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

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

BTW: Я предпочитаю "LOGGER"; -)

Ответ 12

Я предпочитаю "регистратор", то есть строчные буквы. Причина не в том, что она постоянная или не постоянная (изменяемая или неизменная). Если бы мы использовали это рассуждение, нам пришлось бы переименовать переменную, если мы изменим каркас журналирования (или если каркас изменит изменчивость регистраторов).

Для меня важнее другие причины.

  1. Регистратор является теневым объектом в классе и не должен быть очень заметным, поскольку он не реализует основную логику. Если мы используем "LOGGER", это привлекает внимание кода, который привлекает слишком много внимания.

  2. Иногда регистраторы объявляются на уровне экземпляра (т.е. не как статические) и даже внедряются как зависимость. Я не хотел бы менять свой код, если я решил изменить способ получения регистратора. Стабильность кода относительно это (гипотетическое во многих случаях) изменение - еще одна причина, по которой я предпочитаю строчные буквы.