У меня есть класс с аннотацией @Data
, но я не уверен, создан ли конструктор с аргументами, или только сгенерированный конструктор является стандартным (без аргументов) из vanilla Java.
Является ли аннотация проекта Lombok @Data конструктором любого типа?
Ответ 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.