如果类具有“org”字段,@Slf4j 会生成“无法引用非静态变量 org”

epo*_*pox 0 java slf4j lombok

为什么,如果我的类有一个org字段,我不能使用@Slf4jLombok 日志注释。以下代码将在第 #3 行产生编译错误:

MyClass.java:[3,1] 无法从静态上下文引用非静态变量 org

import lombok.extern.slf4j.Slf4j;

@Slf4j
class MyClass {
  String org;

  void printDebug() { log.debug("Org: " + org); }
}
Run Code Online (Sandbox Code Playgroud)

Lombok 文档 ( projectlombok.org/features/log ) 声称它添加了一个log字段。为什么它与 冲突org

epo*_*pox 5

如果您在 IntelliJ 中右键单击 -> Refactor -> Delombok -> @Log (和朋友),您将看到生成的字段初始化以以下内容开头 = org.slf4j...

private static final Logger log = org.slf4j.LoggerFactory.getLogger(MyClass.class);
//                                ^^^ - this is ambiguous
Run Code Online (Sandbox Code Playgroud)

这会产生与您的领域的冲突org

String org;
//     ^^^
Run Code Online (Sandbox Code Playgroud)

Lombok 团队可以通过注入来解决这个问题import org.slf4j.LoggerFactory,但他们可能认为修复的需求不是那么高。这是 Lombok 贡献者的意见:

...这是java语言中的一个障碍,它对两个完全不同的概念使用相同的表示法。不知道在 lombok 中可以做什么来解决这个问题,而不在其他地方创建其他问题。[参考]


解决方案:因此,如果您有org字段,只需替换您的:

  • import lombok.extern.slf4j.Slf4j;
  • @Slf4j和:

import static org.slf4j.LoggerFactory.getLogger;



  private static final Logger log = getLogger(MyClass.class);
  
Run Code Online (Sandbox Code Playgroud)