如果列表为空,则验证很好

时间:2017-11-25 17:59:52

标签: java

我有一个包含多个列表的对象

public class Contribution<T extends MovieRequest> {
    private Set<T> elementsToAdd;
    private Set<T> elementsToUpdate;
    private Set<Integer> numbersToDelete;
}

此对象被发送到该方法。在那里我操作这些列表。

    public void correctOtherTitle(
            final Contribution<OtherTitle> contribution
    ) throws ResourceNotFoundException {
        contribution.getElementsToAdd().forEach(otherTitle -> {
             ...
        });
        contribution.getNumbersToDelete().forEach(number -> {
             ...
        });
        contribution.getElementsToUpdate().forEach(otherTitleToUpdate -> {
             ...
        });
    }

问题是没有必要完成所有列表,其中一些列表可能为空。然后抛出NullPointerException异常。 当然,可以创建条件if,但它看起来并不美观。

if(contribution.getElementsToAdd() !- null) {    
       contribution.getElementsToAdd().forEach(otherTitle -> {
             ...
        });
}

看起来很致命。你知道怎么做得更好吗?

2 个答案:

答案 0 :(得分:0)

为避免使用显式if进行非空检查,您可以将包含实际数据的Contribution类字段的类型更改为Optional

public class Contribution<T extends MovieRequest> {
    private Optional<Set<T>> elementsToAdd;
    private Optional<Set<T>> elementsToUpdate;
    private Optional<Set<Integer>> numbersToDelete;
}

并因此适应吸气剂。

通过这种方式,您可以使用省略显式非空检查的Optional.ifPresent(Consumer<? super T> consumer)

contribution.getElementsToAdd().ifPresent(otherTitle -> {
     otherTitle.forEach(m -> ...);
});

也没有必要非常优雅。
但是,它会减少代码重复,而不会引入中间变量(这可能会产生副作用)。 确实调用了Getter方法一次。

答案 1 :(得分:0)

  

问题是没有必要完成所有列表,其中一些列表可能为空。

我认为你应该解决根本问题,而不是解决它。为什么这些集合可以为空?你已经有了一个安全的&#34;表示没有添加/删除/更新的方法 - 空集。因此,如果这些集合在您的控制之下(事实上它们是private并且您有吸气剂意味着这一点),那么您应该强制执行该不变量。

例如,您的Contribution课程可能如下所示:

public class Contribution<T extends MovieRequest> {
    private Set<T> elementsToAdd = new HashSet<>();
    // ... same for elementsToUpdate / numbersToDelete ...

    public Set<T> getElementsToAdd() {
        return Collections.ummodifiableSet(elementsToAdd);
    }

    public void addElementToAdd(T element) {
        elementsToAdd.add(element);
    }
}

这种模式涉及相当多的样板。但是像Immutables这样的代码生成器对此有很大的帮助。