Java“自”(静态)引用

问题描述 投票:9回答:4

我正在寻找一个静态上下文方式的JAVA当前类的“自我”引用,就像在PHP Scope Resolution Operator中一样?

解决方案:超出范围?请注意,这与静态定义相比真的很慢(乘以300):

static Logger LOG = LoggerFactory.getLogger(new RuntimeException().getStackTrace()[0].getClassName());

老式的方式是:

static Logger LOG = LoggerFactory.getLogger(<Classname>.class.getName());

还有其他选择吗?我正在寻找一种将记录器定义放在抽象类中的方法。记录器应该确定它自己调用的类。

java static scope self
4个回答
13
投票

稍快一点

static final Logger LOG = LoggerFactory.getLogger(
       Thread.currentThread().getStackTrace()[0].getClassName());

如果你这样做了1000次,那么使用Class.class.getName()需要36 ms,而这样做需要60 ms。也许它不值得担心太多。 ;)


4
投票

你不应该继承记录器。只需在每个类中声明记录器。

但如果你不想做这样有用的思考,就不要让它静止)


0
投票

我不认为在你的问题中有任何与这两者有显着差异的替代方案。

您可以创建一个这样的帮助方法:

public static String getCallingClassname() {
    return new RuntimeException().getStackTrace()[1].getClassName();
}

然后

static Logger LOG = LoggerFactory.getLogger(Helper.getCallingClassname());

但这和原始版本一样昂贵。 (FWIW - 慢300倍可能不是主要问题,除非你有成千上万的这些记录器。这些静力学中的每一个都只被初始化一次......)

我个人的偏好是采用“老式”的方式。


0
投票

您不需要使用任何这些。我觉得使用方便的是: //记录仪

private static final Logger logger = LoggerFactory.getLogger(CreateEmployeeRecord.class或this.class);

在需要记录的每个类中执行此操作,并将括号中的类名更改为相应的类,无论它在何处使用。

© www.soinside.com 2019 - 2024. All rights reserved.