Имеет ли смысл объявить регистратор в верхнем регистре и сделать его окончательным? - PullRequest
0 голосов
/ 26 сентября 2010

Есть ли причина для этого:

private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);

вместо этого?

private static Logger logger = LoggerFactory.getLogger(Main.class);

Я не понимаю, в чем заключается синтаксическое преимущество одного над другим.Кажется, что оба работают нормально.

Ответы [ 6 ]

5 голосов
/ 26 сентября 2010

Это соглашение, унаследованное от мира C / C ++, что константы имеют все прописные буквы . Поскольку в Java ближайшим эквивалентом константы является static final, эти члены часто называются аналогично.

В этом случае различие может быть не таким важным, поскольку объекты регистратора семантически не являются константами . Тем не менее, все равно рекомендуется объявить их static, чтобы убедиться, что у вас есть один экземпляр для каждого класса, и вы можете объявить их final, чтобы гарантировать, что ссылка на объект не может быть изменена позже (и для передачи это факт читателям вашего кода).

Обновление комментария @ Moncader:

  1. static эквивалентен C ++ (класс) static - точно так же, как бессмысленно в C ++ объявлять ваши константы как нестатические, в Java также нет смысла.

  2. final - это , а не прямой эквивалент C ++ const. Это означает, что указанная ссылка не может быть изменена. Тем не менее, это не мешает менять указанный объект! Таким образом, он работает только как const, если он защищает примитивное значение (например, int) или ссылку на неизменный объект (например, String). Чтобы остаться в нашей текущей теме, рассмотрим

    private static final Logger logger = LoggerFactory.getLogger (Main.class); ... logger.setLevel (Level.INFO); logger.addAppender (...); logger.setAdditivity (ложь);

Все эти вызовы явно меняют состояние регистратора, даже если он объявлен final. Это то, что я имел в виду выше, говоря, что объекты логгера семантически не являются константами.

3 голосов
/ 26 сентября 2010

Зачем делать это окончательно?

Потому что таким образом вы уверены, что никто не сможет изменить текущий регистратор.

Почему именно LOGGER, а неLogger?

Это соглашение Java.Константы именуются в верхнем регистре.

Имена переменных, объявленных как константы класса, так и констант ANSI, должны быть все в верхнем регистре со словами, разделенными подчеркиванием ("_").(Для простоты отладки следует избегать использования констант ANSI.)


Ресурсы:

2 голосов
/ 26 сентября 2010

final означает, что вы не можете изменить ссылку, чтобы указать на что-то еще.

Верхний регистр - это просто соглашение о кодировании, которое подсказывает читателю, что это статическая константа класса, особенно если вы ссылаетесь на нее коротким именем класса при обращении к нему (например, Foo.LOGGER.info("message");) Соглашения о кодировании Sun Java .

1 голос
/ 26 сентября 2010

Некоторые (не все) виртуальные машины Java оптимизируют конечные константы, которые ускоряют доступ к вашему логгеру.Поэтому, если значение где-либо в вашей программе никогда не изменится, сделайте его окончательным.

LOGGER - это именно то, что люди Java делают для констант.Если вы действительно хотите сделать его строчным, нет никакой разницы с точки зрения производительности или чего-либо программного.

0 голосов
/ 26 сентября 2010

Если вы используете инструмент проверки кода, такой как PMD , то вы увидите, что static final logger (нижний регистр) будет помечен как предупреждение.

Существует больше информации оверхний и нижний регистр в обсуждении этого ТАКОГО вопроса, который я задавал ранее.

0 голосов
/ 26 сентября 2010

Функциональной разницы нет.В вашем первом примере логгер является константой, он никогда не может измениться.Использование всех заглавных букв для констант является соглашением Java.Во втором примере регистратор статический, но не окончательный, поэтому его можно изменить с помощью кода вызывающего абонента.Вы, вероятно, не хотите этого, поэтому я бы использовал первый вариант.

...