Должен ли регистратор быть объявлен статическим или нет? Обычно я видел два типа объявления регистратора:
защищенный журнал журнала = новый Log4JLogger (aClass.class);
или
частный статический журнал журнала = новый Log4JLogger (aClass.class);
Какой из них использовать? каковы плюсы и минусы обоих?
static
- одна ссылка на класс. нестатический - одна ссылка на экземпляр (+ инициализация). Так что в некоторых случаях последнее оказывает значительное влияние на память, если у вас множество экземпляров. Никогда не используйте нестатические предметы в часто посещаемых объектах. Я всегда использую статическую версию. (который должен быть в верхнем регистреLOG
)private static final Log log
строчные буквы. Регистратор не является константой, регистратор - это статический конечный объект (который может быть изменен). Лично я всегда пользуюсьlogger
.Ответы:
Преимущество нестатической формы состоит в том, что вы можете объявить ее в (абстрактном) базовом классе, как показано ниже, не беспокоясь о том, что будет использовано правильное имя класса:
Однако его недостаток, очевидно, заключается в том, что для каждого экземпляра класса будет создаваться совершенно новый экземпляр регистратора. Само по себе это может быть не дорого, но добавляет значительные накладные расходы. Если вы не хотите этого, используйте
static
вместо этого форму. Но его недостаток, в свою очередь, состоит в том, что вы должны объявлять его в каждом отдельном классе и заботиться в каждом классе о том, чтобы правильное имя класса использовалось во время создания регистратора, посколькуgetClass()
не может использоваться в статическом контексте. Однако в средней среде IDE для этого можно создать шаблон автозаполнения. Напримерlogger
+ctrl+space
.С другой стороны, если вы получаете регистратор от фабрики, которая, в свою очередь, может кэшировать уже созданные регистраторы, то использование нестатической формы не добавит таких накладных расходов. Log4j, например, имеет
LogManager
для этой цели.источник
abstract Log getLogger();
в абстрактном классе. Реализуйте этот метод, вернув статический регистратор для конкретного экземпляра. Добавьтеprivate final static Log LOG = LogManager.getLogger(Clazz.class);
в свой шаблон класса IDE.protected Logger log = LoggerFactory.getLogger(getClass());
Раньше я думал, что все логгеры должны быть статичными; однако эта статья на wiki.apache.org поднимает некоторые важные проблемы с памятью, касающиеся утечек загрузчика классов. Объявление регистратора статическим предотвращает сбор мусора объявляемого класса (и связанных загрузчиков классов) в контейнерах J2EE, которые используют общий загрузчик классов. Это приведет к ошибкам PermGen, если вы повторно развернете приложение достаточное количество раз.
Я действительно не вижу никакого способа обойти эту проблему с утечкой загрузчика классов, кроме объявления регистраторов нестатическими.
источник
Самая важная разница заключается в том, как это влияет на ваши файлы журналов: в какую категорию попадают журналы?
Есть вариант вашего первого случая:
защищенный журнал журнала = новый Log4JLogger (getClass ());
В этом случае в категории журнала указано, над каким объектом работал код, с которым работал журнал.
Во втором варианте (частный статический) категория журнала - это класс, содержащий код ведения журнала. Итак, обычно класс, который делает то, что регистрируется.
Я настоятельно рекомендую последний вариант. По сравнению с другими решениями он имеет следующие преимущества:
Также у него есть недостатки:
источник
Используйте инверсию управления и передайте логгер в конструктор. Если вы создадите регистратор внутри класса, у вас будет чертовски время с вашими модульными тестами. Вы пишете модульные тесты, не так ли?
источник