Java 登录接口方法
到目前为止,我一直在研究java 7,最近又转到了java-8,令人惊讶的是,您可以使用java-8接口 到目前为止还不错…喜欢这个新东西 现在,我的问题是,Java 登录接口方法,java,logging,java-8,slf4j,Java,Logging,Java 8,Slf4j,到目前为止,我一直在研究java 7,最近又转到了java-8,令人惊讶的是,您可以使用java-8接口 到目前为止还不错…喜欢这个新东西 现在,我的问题是,日志记录是任何开发的重要组成部分,但似乎不允许通过接口方法添加日志内容,因为它只允许在类和枚举上使用 您如何记录接口方法(如果是通过lombok还是唯一的方法??)?还是不应该记录接口方法?我错过了什么 附言:目前我正在使用System.out.println。。。。是的……这是noob:)您可以手动将记录器添加到界面中,但您的记录器将是公
日志记录
是任何开发的重要组成部分,但似乎不允许通过接口方法添加日志
内容,因为它只允许在类
和枚举
上使用
您如何记录接口方法(如果是通过lombok
还是唯一的方法??)?还是不应该记录接口方法?我错过了什么
附言:目前我正在使用System.out.println
。。。。是的……这是noob:)您可以手动将记录器添加到界面中,但您的记录器将是公共的:
public interface SomeInterface {
Logger log = LoggerFactory.getLogger(SomIface.class);
default void action() {
log.info("TEST");
}
}
日志记录是一个实现细节,因此接口不应该处理它。如果将日志记录视为接口的责任,则会导致几个问题。例如:
- 如果有多个类实现,您不知道使用的是哪一个,因为它们使用相同的名称登录。在配置中也不可能通过它们的名称来微调它们的日志级别
- 默认方法是公共的,这意味着可以从外部调用它们。这对于日志记录方法不是很理想
- 日志记录方法只会污染接口。如果“Map”接口包含这种默认方法,我们会怎么说“logDebug”左右。它只是让人困惑,并导致不必要的问题。接口应该是用于预期目的的干净API
您可以使用什么来替代:
- 某种龙目岛也支持的代表团。(组成重于继承)
- 某种面向方面的编程技术。这方面有框架,但也可以通过“动态代理”来实现。这也与接口有关
目前Lombok@Slf4j
注释在接口上不受支持,
但它可以像这样规避
public interface MyInterface
{
@Slf4j
final class LogHolder
{}
default void action() {
LogHolder.log.error("Error TEST");
}
}
这是否与slf4j
log相同?lombok slf4j实际上添加了行Logger log=LoggerFactory.getLogger(SomIface.class)这样你就可以避免这样的例行工作了。我的帖子中的例子是使用SLF4J4,在这种态度下,可以在任何其他类中声明一个公共静态记录器并使用它,可能通过一个静态方法,也可能通过静态导入。不需要接口和接口中的默认方法。像“sonar”这样的代码检查器不会建议你这样做。警告“将常量移动到类或枚举”。仍然存在请记住此记录器将是静态的,以及接口中定义的任何属性。我认为您不理解Java中“接口上的实现”的概念。这里的实现只能是静态的,它不是由实现类继承的。你说的“静态”和“非继承”是什么意思?接口中的常量是静态的,没错。但“默认”方法不是静态的。它可以在实现类的实例上调用,因此是继承的。下面是关闭/拒绝的Lombok功能请求,以支持接口上的日志注释: