向所有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);
}

10-02 04:21
查看更多