从默认接口方法记录

Tom*_*ral 19 java interface java-8

向所有Java大师致敬!

从Java8开始,我们可以在接口中使用默认实现(yay!).但是,如果要从默认方法进行日志记录,则会出现问题.

我有一种感觉,每次我想在默认方法中记录某些内容时调用.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

LogHolder对所有人来说仍然是可见的,因为它没有提供任何方法,并且它应该是接口内部的.

你们有没有人知道更好的解决方案?:)

编辑:我使用Logback支持的SLF4J

Hol*_*ger 11

如果您不想将类LogHolder公开给公众,请不要将其作为成员类interface.使它成为成员类没有任何好处,你甚至不保存输入,因为你必须使用持有者类的名称限定字段访问,无论它是成员类还是同一个包中的类:

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);
}
Run Code Online (Sandbox Code Playgroud)