Проверьте на нулевое значение перед установкой переменной - без if-else - PullRequest
0 голосов
/ 16 апреля 2019

Я использую Lombok-Builder для создания моего api Java-объекта из entity объекта

RewardApi.builder()
                .rewardId(rewardEntity.getrewardId())
                .rewardTitle(rewardEntity.getrewardTitle())
                .rewardText(rewardEntity.getrewardText())
                .rewardFor(rewardEntity.getrewardFor())
                .rewardType(rewardEntity.getrewardType())
                .rewardFromDate(rewardEntity.getrewardFromDate().toZonedDateTime())
                .rewardToDate(rewardEntity.getrewardToDate().toZonedDateTime())
                .isDisplayOn(rewardEntity.getIsDisplayOn())
                .createdId(rewardEntity.getCreatedId())
                .updatedId(rewardEntity.getUpdatedId())
                .createdDate(rewardEntity.getCreatedDate().toZonedDateTime())
                .lastModifiedDate(rewardEntity.getLastModifiedDate().toZonedDateTime())
                .build();

Я получаю nullPointerException, пока задаю поле lastModifiedDate, потому что объект entityполучает это поле как null и выполняет toZonedDateTime() поверх null

Как справиться с этим без традиционного (как упомянуто ниже) действия

if (null!=rewardEntity.getLastModifiedDate(){....}

Я хотел проверить null, пока я устанавливал переменную, используя builder-pattern, а не делать проверку null после построения объекта.Любые пути?

Ответы [ 3 ]

3 голосов
/ 16 апреля 2019

Все дети любят Optional в эти дни:

Optional.ofNullable(rewardEntity.getLastModifiedDate())
    .map(r -> r.toZonedDateTime())
    .orElse(null) // or some other default value
3 голосов
/ 16 апреля 2019
rewardEntity.getLastModifiedDate() != null ? rewardEntity.getLastModifiedDate().toZonedDateTime() : null 

Он называется условным оператором, который является троичным оператором, поскольку имеет три операнда.

1 голос
/ 16 апреля 2019

у вас может быть универсальный вспомогательный метод, который обрабатывает нулевые случаи, например

static <T, R> R transform(T obj, Function<T, R> function) {
    return obj != null ? function.apply(obj) : null;
}

и используйте его следующим образом

.rewardToDate(transform(rewardEntity.getRewardToDate(), OffsetDateTime::toZonedDateTime))

На самом деле лучше "переопределить" методы компоновщика lombok, потому что то, что у вас сейчас есть, больше похоже на заполнитель / DTO, а не на компоновщик:

@Builder
private static class RewardApi {
    //...
    private ZonedDateTime rewardToDate;

    public static class RewardApiBuilder {

        public RewardApiBuilder rewardToDate(OffsetDateTime offsetDateTime) {
            if(offsetDateTime != null) {
                this.rewardToDate = offsetDateTime.toZonedDateTime();
            }
            return this;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...