Как использовать ломбок с конструктором по умолчанию - PullRequest
1 голос
/ 31 марта 2020

Мой класс AssignedPropertiesDTO:

@Data
@Builder
@AllArgsConstructor
public class AssignedPropertiesDTO {

  @JsonProperty("hotel_id")
  private Long hotelId;

  @JsonProperty("oyo_id")
  private String oyoId;

  @JsonProperty("drn")
  private Integer dsrn;

  @JsonProperty("is_sold_out")
  private Boolean isSoldOut;

  @JsonProperty("is_purged")
  private Boolean isPurged;

  AssignedPropertiesDTO() {
    this.isSoldOut = false;
    this.isPurged = false;
  }

}

Мне нужно установить isSoldOut и isPurged в false. Вот почему я сделал конструктор по умолчанию. Но я использую Builder () для установки полей класса, а где-то просто для установки свойств с помощью getter / setter.

  AssignedPropertiesDTO matchingObject = assignedPropertiesDTOS.stream()
      .filter(assignedPropertiesDTO ->
          assignedPropertiesDTO.getHotelId().equals(Long.valueOf(entry.getKey())))
      .findFirst().orElse(null);
  if (matchingObject == null) {
    assignedPropertiesDTOS.add(AssignedPropertiesDTO
        .builder().hotelId(Long.valueOf(entry.getKey())).dsrn(count).build());
  } else {
    matchingObject.setDsrn(count);
  }

Мое требование - установить Ispurged / IsSoldOut либо в True / False, но не в NULL.

[      {
                "hotel_id": 45693,
                "oyo_id": "GOA2161",
                "drn": null,
                "is_sold_out": null,
                "is_purged": null
            },
            {
                "hotel_id": 45693,
                "oyo_id": "GOA2161",
                "drn": null,
                "is_sold_out": true,
                "is_purged": false
            } ]

Пожалуйста, подскажите, как мне это сделать.

Ответы [ 3 ]

2 голосов
/ 31 марта 2020

@Builder создает конструктор из всех аргументов; он не знает о значениях не по умолчанию, необходимых для isSoldOut и isPurged. Для этого вы можете использовать функцию @Builder.Default: например, @Builder.Default private Boolean isSoldOut = false;.

В качестве альтернативы просто сделайте их строчными буквами b логическими значениями, и теперь "false" является естественным значением по умолчанию. Если это вообще вариант, на данный момент это лучшее решение.

Ваш последний вариант - создать конструктор all-args самостоятельно.

1 голос
/ 31 марта 2020

Вы пытались присвоить логические значения со значениями по умолчанию? Стоит отметить, что логическое значение по умолчанию - false. Кроме того, используйте логическое значение, а не логическое значение, чтобы оно не могло поддерживать null.

В несвязанной заметке вы обычно не присваиваете логические имена, начинающиеся с 'is'. Это, как правило, оставлено для доступа.

@JsonProperty("sold_out")
private boolean soldOut;
1 голос
/ 31 марта 2020

Когда вы определяете isPurged и isSoldOut как boolean вместо Boolean, переменные инициализируются как false по умолчанию (согласно вашему конструктору).

На случай, если вам нужно другая инициализация, вы можете просто определить ее при объявлении переменной, например, установив одну в true, а другую в false:

Data
@Builder
@AllArgsConstructor
public class AssignedPropertiesDTO {

  @JsonProperty("is_sold_out")
  private boolean isSoldOut = true;

  @JsonProperty("is_purged")
  private boolean isPurged = false;
}
...