登录接口方法

logging in interface methods

到目前为止,我一直在研究 java 7,最近转移到 java-8,令人惊讶的是你可以 add methods 在 java -8 个接口。

到目前为止一切顺利....喜欢这个新东西!

现在,我的问题是 logging 是任何开发的重要组成部分,但似乎 lombok.extern.slf4j 不允许您通过接口方法添加 log 东西,因为它只是classesenums.

允许

你如何log你的接口方法(如果通过lombok唯一的方法??)?还是不应该记录接口方法?我在这里错过了什么?

P.S :目前我正在与 System.out.println 合作......是的......那是 noob :)

您可以手动将记录器添加到您的界面,但您的记录器将是 public:

public interface SomeInterface {
    Logger log = LoggerFactory.getLogger(SomIface.class);

    default void action() {
        log.info("TEST");
    }
}

日志记录是一个实现细节,因此接口不应处理它。如果日志记录被认为是接口的责任,那将导致几个问题。例如:

  • 如果有多个 class 实现,您不知道使用了哪一个,因为它们使用相同的名称登录。也无法通过配置中的名称微调它们的日志级别。
  • 默认方法是public,这意味着它们可以从外部调用。这对于日志记录方法来说不是很理想。
  • 记录方法只会污染界面。如果 'Map' 接口包含这种默认方法,人们会怎么说? 'logDebug' 左右。这只会令人困惑并导致不必要的问题。界面应该是干净的 API 用于预期目的。

您可以改用什么:

  • Lombok 也支持某种委托。 (组合优于继承)
  • 某种面向方面的编程技术。有相应的框架,但也可以通过 "Dynamic Proxies" 实现相同的目标。这也与接口有关。

当前接口不支持 Lombok @Slf4j 注释, 但是可以这样绕过

public interface MyInterface
{
    @Slf4j
    final class LogHolder
    {}

    default void action() {
        LogHolder.log.error("Error TEST");
    }
}

我们可以在接口中添加抽象方法getLogger。并要求实现者传递记录器对象。

public interface CustomRepo{
 
    Logger getLogger();

    default void processData(Data data){
        // Do something 
        getLogger().info("Processing");
        // Do something
    }

}

@Slf4j
public RepoImplementer implements CustomRepo {

   @Override
   public Logger getLogger(){
      return log;
   }
}