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

时间:2018-02-22 18:54:07

标签: java javaoptions

这是一个很好的代码风格和良好的选择使用? 这似乎不正确,因为该方法返回一个泛型,但正文不使用泛型返回。此外,由于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 ??

3 个答案:

答案 0 :(得分:4)

您的客户端代码展示了Optional

的目的

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

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

Optional比简单null检查更好的原因。

答案 1 :(得分:0)

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

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

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

}

答案 2 :(得分:0)

null的可选项很糟糕。使用Optional.empty()

虽然Optional迫使您在访问结果之前处理null case,但使用isPresent()没有意义。使用null将生成相同的代码,但没有必要的可选包装器。 Optional为您提供了“展开”结果值的更好替代方案。

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

使用orElseGet(),您可以计算替代值。如果为空,则执行此计算onlz。

或使用orElseThrow()表示无值的操作无法继续。

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