0

在我的课堂上,我需要一个以类为参数的 SLF4J Logger,以及一个简单的类名。logger 和 CLASS_NAME 常量都使用 MethodHandles.lookup()。我想知道拥有这样的东西是否更有意义/更有效:

private static final Lookup lookup = MethodHandles.lookup();
private static final Logger logger = LoggerFactory.getLogger(lookup.getClass());
private static final String CLASS_NAME = lookup.lookupClass().getSimpleName();

或者只使用 MethodHandles.lookup() 两次:

private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().getClass());
private static final String CLASS_NAME = MethodHandles.lookup().lookupClass().getSimpleName();
4

1 回答 1

1

鉴于这两个选项,我会选择第二个。如果不再直接需要查找对象,则没有理由维护对查找对象的永久引用。获取查找实例的成本相对便宜,而且这段代码只运行一次——在类初始化时。

但是,我不确定您为什么首先调用查找。这里的正常模式是使用类文字。

顺便说一句,如果您真的需要引用一次性常量,最好的方法是使用静态初始化程序。

private static final Logger logger;
private static final String CLASS_NAME; 

static {
    var lookup = MethodHandles.lookup();
    logger = LoggerFactory.getLogger(lookup.getClass());
    CLASS_NAME = lookup.lookupClass().getSimpleName();
}
于 2021-08-20T03:53:44.383 回答