向所有Java专家致敬!
从Java8开始,接口中可以有默认实现(耶!)。 然而,当您想要在默认方法中记录日志时就会出现问题。
我感觉每次在默认方法中记录日志都调用.getLogger()不明智。
是的,一个解决方法是在接口中定义静态变量,但这并不是良好的接口实践 + 它会暴露日志记录器(必须是public)。
目前我的解决方案:
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
LogHolder
类或一个公共的Logger LOGGER
没有太大区别。 - assylias