0

这是良好的代码风格和良好的使用选项吗?这似乎不正确,因为该方法返回一个泛型,但主体没有使用泛型返回。此外,由于 IF 语句,“闻起来”有点难闻。

public Optional<MyObjectType> readData() {
    MyObjectType[] myArray = // Will not be null, but maybe Size 0.
    if(myArray.length > 0)
        return Optional.of(myArray[0]);

    return Optional.of(null);
}

在客户端,我有:

public void clientCode() {
    Optional<CurrencyPointData> oData = readCurrency(Currency.ADA);
    if(oData.isPresent()) {
        CurrencyPointData data = oData.get();
        // Use data object
    }
}

这似乎也不比普通if(oData == null)检查好多少。

因此,这段代码看起来很垃圾,所以我不应该使用 Optional 吗?

4

3 回答 3

4

您的客户端代码展示了Optional.

它鼓励代码isPresent()在调用之前检查get(),突出可能没有值的问题,不像简单地使用CurrencyPointDatawithout Optional,然后未定义返回值是否可以是null。当然,您可以记录方法是否可以返回null,但这在代码中并不明显,而且我们都知道人们很少详细阅读文档。

Optional您明确表示可能缺少该值。

就是为什么Optional比简单null检查要好。

于 2018-02-22T19:04:15.790 回答
0

考虑不要使用 orElse 在其余代码中携带 Optional。

此外,您可以避免使用 Option 的“if”,它使您的代码更清晰。

public void clientCode() {
    Optional<CurrencyPointData> oData = readCurrency(Currency.ADA);
    CurrencyPointData data = oData.orElse(new CurrencyPointData(...));

}
于 2018-02-22T19:09:34.093 回答
0

可选的 null 是不好的。使用Optional.empty().

尽管Optional强制您null case在访问结果之前进行处理,但使用isPresent(). 使用 null 将产生相同的代码,但没有不必要的 Optional 包装器。Optional 为您提供了更好的替代方案来“解包”结果值。

如果缺少值,您可以使用orElse()默认值。

orElseGet()您可以计算替代价值。在 Optional 为空的情况下仅执行此计算。

或者orElseThrow()用来表示没有值的操作不能继续。

除了将值传递给其他对象之外,还有ifPresent()一个有用的方法。

于 2018-02-22T19:11:01.260 回答