Java“自”(静态)引用

时间:2011-03-11 09:18:01

标签: java static scope self

我正在以PHP Scope Resolution Operator中的静态上下文方式寻找JAVA中当前类的“self”引用?

解决方案:超出范围?请注意,这与静态定义真正慢(按因子300)进行比较:

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

老式的方式是:

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

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

4 个答案:

答案 0 :(得分:13)

稍快一点

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

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

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

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

然后

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

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

我个人倾向于采用“老式”的方式。

答案 3 :(得分:0)

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

私有静态最终Logger logger = LoggerFactory.getLogger(CreateEmployeeRecord.class或this.class);

在每个需要记录的类中执行此操作,然后将括号中的类名称更改为使用位置的相应类。