Java "self" (статическая) ссылка

Я ищу ссылку "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 раз медленнее, вероятно, не является серьезной проблемой, если у вас нет тысяч этих регистраторов. Каждая из этих статики инициализируется только один раз...)

Мое личное предпочтение - "старомодный" способ сделать это.