Является ли аннотация проекта Lombok @Data конструктором любого типа?

У меня есть класс с аннотацией @Data, но я не уверен, создан ли конструктор с аргументами, или только сгенерированный конструктор является стандартным (без аргументов) из vanilla Java.

Ответ 1

@RequiredArgsConstructor будет сгенерирован, если конструктор не был определен.

Страница Project Lombok @Data объясняет:

@Data похож на наличие неявных аннотаций @Getter, @Setter, @ToString, @EqualsAndHashCode и @RequiredArgsConstructor для класса (за исключением того, что конструктор не будет создан, если существует какой-либо явно написанный конструктор).

Ответ 2

@Data только создает @RequiredArgsConstructor. Сайт документации Lombok для аннотации данных и конструкторов объясняет:

@RequiredArgsConstructor генерирует конструктор с 1 параметром для каждого поля, которое требует специальной обработки. Все неинициализированные конечные поля получают параметр, а также любые поля, помеченные как @NonNull, которые не инициализированы там, где они объявлены. Для полей, помеченных @NonNull, также генерируется явная проверка нуля. Конструктор сгенерирует исключение NullPointerException, если какой-либо из параметров, предназначенных для полей, помеченных @NonNull, будет содержать значение null. Порядок параметров соответствует порядку, в котором поля появляются в вашем классе.

Предположим, у вас есть POJO, который использует аннотацию Lombok @Data:

public @Data class Z {
    private String x;
    private String y;
}

Вы не можете создать объект как Z z = new Z (x, y), потому что в вашем классе Z нет аргумента, который является "обязательным". Он создает конструктор с нулевыми параметрами, потому что @Data предоставляет вам Setters и Getters для ваших свойств, и вы можете вызывать setX и setY после создания вашего экземпляра.

Вы можете сделать x и y @NonNull или final, чтобы они передавались через конструктор, или аннотировать ваш класс Z с помощью @AllArgsConstructor.