这是好的代码和 Java 选项的使用吗

Is this Good Code and Use of Java Option

这样的代码风格和Option的使用好吗? 这似乎不对,因为方法 return 是一个泛型,但主体没有使用泛型 return。另外,'smells' 由于 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 吗??

您的客户端代码展示了 Optional 的用途。

它鼓励代码在调用 get() 之前检查 isPresent(),强调可能没有价值的问题,这与不使用 Optional 的情况下简单地使用 CurrencyPointData 不同然后未定义 return 值是否可以是 null。当然,你可以文档是否方法可以returnnull,但这在代码中并不明显,我们都知道人们很少详细阅读文档。

对于 Optional,您明确表示该值可能缺失。

这就是 为什么 Optional 比简单的 null 检查更好的原因。

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

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

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

}

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

虽然 Optional 强制您在访问结果之前处理 null case,但使用 isPresent() 没有任何意义。使用 null 会产生相同的代码,但没有不必要的 Optional 包装器。 Optional 为您提供了 "unwrap" 结果值的更好替代方案。

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

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

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

还有一个 ifPresent() ,当您除了将其传递给其他对象之外没有其他用处时,它很有用。