【发布时间】:2015-04-27 13:18:37
【问题描述】:
向所有 Java 大师致敬!
从 Java8 开始,我们可以在接口中使用默认实现(耶!)。 但是,当您想从默认方法登录时会出现问题。
我觉得每次我想用默认方法记录一些东西时调用 .getLogger() 是不明智的。
是的,可以在接口中定义静态变量 - 但无论如何这对接口来说都不是一个好习惯 + 它公开了记录器(必须是公共的)。
我目前的解决方案:
interface WithTimeout<Action> {
default void onTimeout(Action timedOutAction) {
LogHolder.LOGGER.info("Action {} time out ignored.", timedOutAction);
}
static final class LogHolder {
private static final Logger LOGGER = getLogger(WithTimeout.class);
}
}
LogHolder 仍然对所有人可见,这实际上没有任何意义,因为它不提供任何方法,并且应该在接口内部。
你们中有人知道更好的解决方案吗? :)
编辑:我使用由 Logback 支持的 SLF4J
【问题讨论】:
-
“我觉得每次我想用默认方法记录一些东西时调用 .getLogger() 是不明智的。”你是否为了支持这种感觉而进行了性能测量?如果不是,请不要在不需要时优化性能。
-
在我看来,公开
LogHolder班级或公开Logger LOGGER并没有太大区别。 -
我看不出有什么理由耶!
-
我不明白如果多个不同的类都在使用这个记录器,这会有什么帮助。
-
@Ray 在我关闭此选项之前,我阅读了一些关于 .getLogger 的内容。每次调用 .getLogger 都被认为是反模式:slf4j.org/faq.html#declared_static 我没有对性能影响进行任何测量 - 但我很想以创建者推荐的方式使用该库。