setter中null和empty check的高效方式是什么

问题描述 投票:0回答:4

我需要为我的 DTO 类中的 27 个字段中的每一个添加 null 和空检查,我正在寻找最有效的方法来完成它。谁能提出任何想法?

private String settingType;
private String settingCode;
private String executionEndDate;
private String startToday;


        if (!ObjectUtils.isEmpty(updateRequest.getSettingType())) {
            builder.setSettingType(updateRequest.getSettingType());
        }
        if (!ObjectUtils.isEmpty(updateRequest.getSettingCode())) {
            builder.setSettingCode(updateRequest.getSettingCode());
        }
        if (!ObjectUtils.isEmpty(updateRequest.getExecutionEndDate())) {
            builder.setExecutionEndDate(updateRequest.getExecutionEndDate());
        }
        if (!ObjectUtils.isEmpty(updateRequest.isStartToday())) {
            builder.setStartToday(updateRequest.getStartToday());
        }

java nullpointerexception setter
4个回答
3
投票

我们可以使用消费者使用这个方法

import java.util.function.Consumer;

    private <T> void setFieldIfNotEmpty(Consumer<T> setter, T value) {
        if (ObjectUtils.isNotEmpty(value)) {
            setter.accept(value);
        }
    }

然后同样使用上面的方法进行null和empty的检查


        setFieldIfNotEmpty(builder::setSettingType, updateRequest.getSettingType());

        setFieldIfNotEmpty(builder::setSettingCode, updateRequest.getSettingCode());

        builder.setStartToday(updateRequest.getStartToday());

        setFieldIfNotEmpty(builder::setExecutionEndDate, updateRequest.getExecutionEndDate());

像这样


1
投票

一种方法是将可能返回空值的方法更改为返回可选类型,例如:

Optional<String> getSettingType() {
    return Optional.ofNullable(settingType);
}

这具有自我记录的优势(它可能不返回任何值的事实现在是明确的),也意味着您可以用这样的东西替换您的代码:

updateRequest.getSettingType().ifPresent(builder::setSettingType);
updateRequest.getSettingCode().ifPresent(builder::setSettingCode);
updateRequest.getExecutionEndDate().ifPresent(builder::setExecutionEndDate);
updateRequest.getStartToday().ifPresent(builder::setStartToday);

这种方法确实意味着创建短暂的 Optional 对象,因此您需要决定它是否足够“有效”。


0
投票

如果它们只是

null
支票,那么写出来可能更容易。

if (updateRequest.getSettingType() != null)
    builder.setSettingType(updateRequest.getSettingType());
if (updateRequest.getSettingCode() != null)
    builder.setSettingCode(updateRequest.getSettingCode());
if (updateRequest.getExecutionEndDate() != null)
    builder.setExecutionEndDate(updateRequest.getExecutionEndDate());
if (updateRequest.isStartToday() != null)
    builder.setStartToday(updateRequest.getStartToday());

0
投票

1.) 最好在构造函数中初始化一些值,这样它就不会为任何字段获得空值。 2.) Java 8 optional 对于空值检查非常有益。

© www.soinside.com 2019 - 2024. All rights reserved.