【问题标题】:Lombok @Slf4j and interfaces?Lombok @Slf4j 和接口?
【发布时间】:2021-01-31 20:42:06
【问题描述】:

我正在尝试将日志记录添加到我的界面默认方法中。例如:

@Slf4j // not allowed
interface MyIFace {
    default ThickAndThin doThisAndThat() {
        log.error("default doThisAndThat() called"); 
    }
}

问题是我得到了:

@Slf4j 仅在类和枚举上是合法的。

处理这个问题的正确方法是什么?

【问题讨论】:

  • throw UnsupportedOperationException("default doThisAndThat()") 可能比记录错误更好。如果该方法未在类中实现并被调用,则异常会阻止代码继续执行,就好像没有出现任何问题一样,而日志记录让代码静默继续,然后也许有人最终会阅读日志并意识到某些事情是可怕的错误用代码。
  • @Andreas 是的,你是对的,但实际上它只是记录任何内容,而不仅仅是错误。所以我选择记录 error 是我的错 :)

标签: java logging slf4j lombok default-method


【解决方案1】:

这里不能使用Lombok,因为注解会生成:


private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(YourClass.class);

您不能在接口中使用 private 关键字。

解决办法是直接写


interface MyIFace {

   org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MyIFace.class);

   default ThickAndThin doThisAndThat() {
     log.error("default doThisAndThat() called"); 
   }

}


【讨论】:

  • 是的,我现在看到了,感谢 delombok。唯一的办法是在没有 Lombok 的情况下将其声明为 public。相反,我还考虑将 MyIFace 更改为具有方法 Logger getLogger(),以便实现类必须返回 @Slf4j 附带的内容。优点是我在记录时得到了实际的类,但另一方面它会暴露每个单独的实现类的记录器。因此,由于界面的公共性质,您无法获得“完美”的解决方案。
  • 这进一步产生了声纳问题 - squid:S1214(常量不应在接口中定义)
猜你喜欢
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
相关资源
最近更新 更多