向所有的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
发布于 2015-02-25 22:09:10
如果不想将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);
}https://stackoverflow.com/questions/28720845
复制相似问题