向所有Java专家致敬!
从Java8开始,我们可以在接口(interface)中使用默认实现(是的!)。
但是,当您想从默认方法登录时会出现问题。
我有种感觉,每次我想在默认方法中记录某些内容时都调用.getLogger()是不明智的。
是的,可以在接口(interface)中定义静态变量-但这对于接口(interface)而言不是一个好习惯,而且+暴露了记录器(必须是公开的)。
我目前的解决方案:
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仍然对所有人可见,这实际上没有任何意义,因为它不提供任何方法,并且应该在接口(interface)内部。
你们中有人知道更好的解决方案吗? :)
编辑:我使用由Logback支持的SLF4J
最佳答案
如果您不想向公众公开LogHolder
类,请不要使其成为interface
的成员类。使其成为成员类没有任何好处,您甚至不必保存输入内容,因为无论如何是成员类还是同一包中的类,无论如何都必须使用holder类的名称来限定字段访问权限:
public interface WithTimeout<Action> {
default void onTimeout(Action timedOutAction) {
LogHolder.LOGGER.info("Action {} time out ignored.", timedOutAction);
}
}
final class LogHolder { // not public
static final Logger LOGGER = getLogger(WithTimeout.class);
}