На самом деле у нас есть нечто очень похожее в классе LogUtils. Да, это немного неприлично, но преимущества того стоят, насколько я понимаю. Мы хотели убедиться, что у нас не было никаких накладных расходов от его повторного вызова, поэтому наш (несколько хакерски) гарантирует, что он может быть вызван ТОЛЬКО из статического инициализирующего контекста, например: 1001 *
private static final Logger LOG = LogUtils.loggerForThisClass();
Сбой, если он вызывается из обычного метода или из инициализатора экземпляра (т. Е. Если выше было указано «static»), снижает риск снижения производительности. Метод:
public static Logger loggerForThisClass() {
// We use the third stack element; second is this method, first is .getStackTrace()
StackTraceElement myCaller = Thread.currentThread().getStackTrace()[2];
Assert.equal("<clinit>", myCaller.getMethodName());
return Logger.getLogger(myCaller.getClassName());
}
Тот, кто спрашивает, какое преимущество это имеет над
= Logger.getLogger(MyClass.class);
, вероятно, никогда не приходилось иметь дело с кем-то, кто копирует и вставляет эту строку откуда-то еще и забывает изменить имя класса, оставляя вам дело с классом, который отправляет все свои вещи другому регистратору.