【问题标题】:Check for null before setting the variable - without if-else在设置变量之前检查 null - 没有 if-else
【发布时间】:2019-04-16 15:44:39
【问题描述】:

我使用Lombok-Builderentity 对象构建我的api java 对象

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();

我在设置lastModifiedDate 字段时得到nullPointerException,因为entity 对象将该字段作为null 并在null 之上执行toZonedDateTime()

如何在没有传统方式(如下所述)的情况下解决这个问题

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

我想在使用builder-pattern 设置变量时检查null,而不是在构建对象后进行null 检查。有什么办法吗?

【问题讨论】:

  • 使用三元运算符
  • rewardEntity.getLastModifiedDate() != null? rewardEntity.getLastModifiedDate().toZonedDateTime() : null 我猜
  • 您是否可以灵活地使用 java 8,如果可以,那么我建议将其包装在类似于 Optional.ofNullable(rewardEntity.getLastModifiedDate()).map(z->z.toZonedDateTime()).orElse(null); 的可选中
  • @foxt7ot 我会说是的,给定标签。
  • @AndyTurner 呵呵!!完全错过了:(

标签: java java-8 lombok


【解决方案1】:

这些天所有的孩子都喜欢Optional

Optional.ofNullable(rewardEntity.getLastModifiedDate())
    .map(r -> r.toZonedDateTime())
    .orElse(null) // or some other default value

【讨论】:

  • OffsetDateTime::toZonedDateTime 而不是r -> r.toZonedDateTime(),但我不明白为什么人们用Optional 来推动这些解决方案
  • @Adrian 提供的getLastModifiedDate() 返回OffsetDateTime 的(子类),是的。
  • 这很酷,我将这段代码放在一个方法中,并在我设置lastModifiedDate的地方调用它
【解决方案2】:
rewardEntity.getLastModifiedDate() != null ? rewardEntity.getLastModifiedDate().toZonedDateTime() : null 

称为条件运算符,是三元运算符,因为它有三个操作数。

【讨论】:

  • 抱歉,我是用手机打字的
  • 不建议保存空值,以后可能会面临NPE
  • 但 OP 很可能已经在这样做了 - 你认为 Builder 是如何工作的?
【解决方案3】:

你可以有一个通用的实用方法来处理空情况,比如

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;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 1970-01-01
    • 2021-09-14
    • 2010-10-09
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 2017-04-26
    • 2021-12-28
    相关资源
    最近更新 更多