@Slf4j создает «нестатическую переменную org, на которую нельзя ссылаться», если в классе есть поле «org».

Почему, если в моем классе есть поле org, я не могу использовать аннотацию журнала @Slf4j Lombok. Следующий код вызовет ошибку компиляции в строке №3:

MyClass.java:[3,1] на нестатическую переменную org нельзя ссылаться из статического контекста

import lombok.extern.slf4j.Slf4j;

@Slf4j
class MyClass {
  String org;

  void printDebug() { log.debug("Org: " + org); }
}

Документация Lombok (projectlombok.org/features/log) утверждает, что добавляет одно поле log. Почему это конфликтует с org?


person epox    schedule 29.08.2020    source источник


Ответы (1)


Если вы в IntelliJ сделаете правый клик -> Refactor -> Delombok -> @Log (и друзья), вы увидите, что инициализация сгенерированных полей начинается с: = org.slf4j...:

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

и это приводит к конфликту с вашим полем org:

String org;
//     ^^^

Команда Lombok могла бы обойти это, внедрив import org.slf4j.LoggerFactory, но они могут подумать, что спрос на исправление не так высок. Это мнение участника Ломбока:

... Это недостаток языка java, который использует одну и ту же нотацию для двух совершенно разных понятий. Не знаю, что можно сделать на ломбоке, чтобы решить эту проблему, не создавая какую-то другую проблему где-то еще. [ССЫЛКА]


РЕШЕНИЕ. Если у вас есть поле org, просто замените import lombok.extern.slf4j.Slf4j; и @Slf4j на:

import static org.slf4j.LoggerFactory.getLogger;



  private static final Logger log = getLogger(MyClass.class);
  
person epox    schedule 29.08.2020