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