我应该返回什么而不是null?

时间:2020-02-20 14:23:51

标签: java collections java-8

我听说返回null是不正确的做法。

在这种情况下,返回null的替代方法是什么?

    public RollingStock getHeadPoint() {
        if (!train.isEmpty()) {
            return train.get(0);
        } else {
            return null;
        }
    }

3 个答案:

答案 0 :(得分:2)

恕我直言,最好的选择是返回Optional<RollingStock>,就像陪衬:

public Optional<RollingStock> getHeadPoint() {
    if (!train.isEmpty()) {
        // or even Optional.ofNullable, if you are not sure 
        // whether train.get(0) is null or not 
        return Optional.of(train.get(0));  
    } else {
        return Optional.empty();
    }
}

假设train是一个集合,作为将值手动包装到Optional中的替代方法,您可以使用Stream API

public Optional<RollingStock> getHeadPoint() {
    return train.stream()
                .findFirst();
}

在某些情况下,使用内联train.stream().findFirst()比将其包装到单独的方法中更为可取。


一旦您已经修改了方法getHeadPoint以返回Optional<RollingStock>,则可以按以下方式使用它:

// ...
RollingStock headPoint = getHeadPoint().orElse(yourDefaultRollingStock);
// or
RollingStock headPoint = getHeadPoint().orElseGet(aMethodGettingYourDefaultRollingStock());
// or
RollingStock headPoint = getHeadPoint().orElseThrow(() -> new Exception("The train is empty!"));
// or
getHeadPoint().ifPresent(headPoint -> doSomethingWithHeadPoint(headPoint));

答案 1 :(得分:0)

您应区分“ get”和“ search/find”方法:

  • getHeadPoint:应该存在一些火车。如果不是,那是对您的生意不利,请抛出异常
  • findHeadPoint:不存在与您的业务相关的火车,返回null

答案 2 :(得分:0)

您可以定义TrainIsEmptyException并在火车为空时抛出该异常。使其成为选中的异常。或者您可以只返回null。