Я ищу ссылку "self" для текущего класса в JAVA в статическом контексте, как в PHP Scope Resolution Operator?
Решение: выйти из сферы действия? ОСТОРОЖНО, это сравнивается со статическим определением действительно медленным (в 300 раз):
static Logger LOG = LoggerFactory.getLogger(new RuntimeException().getStackTrace()[0].getClassName());
Старомодный способ:
static Logger LOG = LoggerFactory.getLogger(<Classname>.class.getName());
Есть ли альтернативы? Я ищу способ определения логгера в абстрактном классе. Регистратор должен определить класс, который он вызывается от себя.
Ответ 1
Немного быстрее
static final Logger LOG = LoggerFactory.getLogger(
Thread.currentThread().getStackTrace()[0].getClassName());
Если вы делаете это 1000 раз, это займет 36 мс, используя Class.class.getName() и 60 мс, делая это таким образом. Возможно, это не стоит слишком беспокоиться.;)
Ответ 2
Вы не должны наследовать регистратор. Просто объявите регистратор в каждом классе.
Но если вы не хотите делать такие полезные мысли, просто не делайте их статичными)
Ответ 3
Я не думаю, что есть альтернативы, которые значительно отличаются от двух в вашем вопросе.
Вы можете создать вспомогательный метод, подобный этому:
public static String getCallingClassname() {
return new RuntimeException().getStackTrace()[1].getClassName();
}
а затем
static Logger LOG = LoggerFactory.getLogger(Helper.getCallingClassname());
но это так дорого, как оригинальная версия. (FWIW - 300 раз медленнее, вероятно, не является серьезной проблемой, если у вас нет тысяч этих регистраторов. Каждая из этих статики инициализируется только один раз...)
Мое личное предпочтение - "старомодный" способ сделать это.