登录接口方法
logging in interface methods
到目前为止,我一直在研究 java 7,最近转移到 java-8,令人惊讶的是你可以 add methods 在 java -8 个接口。
到目前为止一切顺利....喜欢这个新东西!
现在,我的问题是 logging
是任何开发的重要组成部分,但似乎 lombok.extern.slf4j
不允许您通过接口方法添加 log
东西,因为它只是classes
和 enums
.
允许
你如何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;
}
}
到目前为止,我一直在研究 java 7,最近转移到 java-8,令人惊讶的是你可以 add methods 在 java -8 个接口。
到目前为止一切顺利....喜欢这个新东西!
现在,我的问题是 logging
是任何开发的重要组成部分,但似乎 lombok.extern.slf4j
不允许您通过接口方法添加 log
东西,因为它只是classes
和 enums
.
你如何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;
}
}