Не удается получить доступ к конструктору с помощью @AllArgsConstructor, но работает с @RequiredArgsConstructor - PullRequest
0 голосов
/ 01 июля 2019

У меня есть класс POJO следующим образом:

@Value
@Builder
public class XYZ {

    @NonNull
    private final String a;

    @NonNull
    private final String b;

    @NonNull
    private final State state;

    public enum State {
        STARTED
    }
}

Когда я пытаюсь создать объект класса XYZ из моей папки tst /, происходит сбой с ошибкой, что конструктор не может быть доступен из внешнего пакета, но когда я использовал @RequiredArgsConstructor в этом POJO, он начинает работать нормально и не работает показать ошибку. Фактическая ошибка такова:

ошибка: XYZ (String, String, State) не является общедоступным в XYZ; не может быть доступ снаружи пакета

Итак, мне было интересно, в чем разница между @AllArgsConstructor (предоставляемым @Value) и @RequiredArgsConstructor, из-за которого я вижу эту проблему.

1 Ответ

2 голосов
/ 02 июля 2019

При обработке своих аннотаций Lombok не учитывает порядок этих аннотаций в исходном файле. Вместо этого каждый тип аннотации имеет приоритет, который определяет порядок обработки. Это потому, что существуют зависимости между различными типами аннотаций.

@Builder имеет более высокий приоритет, чем @Value. Таким образом, Lombok сначала генерирует конструктор all-args для частного пакета, необходимый для компоновщика. В результате при обработке @Value уже присутствует конструктор. Согласно документации @Value , "любой явный конструктор, независимо от списка аргументов, подразумевает, что lombok не будет генерировать конструктор".

Однако, на мой взгляд, это немного вводит в заблуждение в документации. Конструктор, сгенерированный для @Builder, больше похож на детали реализации, но я бы не назвал это «явным конструктором». (Под «явным» авторы, вероятно, подразумевают «не конструктор по умолчанию».)

Как только вы добавите @RequiredArgsConstructor или @AllArgsConstructor (что в данном случае тоже самое), конструктор станет общедоступным, и ни @Builder, ни @Value не будут генерировать его больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...