首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从默认接口方法进行日志记录

从默认接口方法进行日志记录
EN

Stack Overflow用户
提问于 2015-02-25 21:56:11
回答 1查看 11.1K关注 0票数 24

向所有的Java大师致敬!

因为Java8,我们可以在接口中有默认实现(耶!)。然而,当你想要从默认方法登录时,问题就出现了。

我有一种感觉,每当我想要在默认方法中记录一些东西时,调用.getLogger()是不明智的。

是的,可以在接口中定义静态变量--但这对接口来说不是一个好的做法,因为它暴露了记录器(必须是公共的)。

我目前有一个解决方案:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-25 22:09:10

如果不想将LogHolder类公开给公众,就不要使它成为interface的成员类。将其设置为成员类没有任何好处,您甚至不需要保存类型,因为无论如何都必须使用holder类的名称来限定字段访问,而不管它是成员类还是同一包中的类:

代码语言:javascript
复制
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);
}
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28720845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档