【发布时间】:2017-01-09 14:39:35
【问题描述】:
在函数式语言中,对可选类型使用模式匹配是很常见的:
let result = match myOptional with
| Some x -> x * 2
| None -> 0
这对程序员很有帮助,因为编译器会检查模式匹配是否完整。
但是,在我看到的 Java 的 Optional 示例中,使用了 isPresent 和 get:
Integer result;
if (myOptional.isPresent()) {
result = myOptional.get() * 2;
} else {
result = 0;
}
对我来说,这违背了Optional 的目的。编译器不检查以确保正确实现if 的两个分支,并且生成的代码与使用null 的等效代码相比没有额外的保证。
这种设计选择不利于安全,那么为什么标准库提供get 函数而不仅仅是match?
【问题讨论】:
-
您希望编译器检查什么“正确性”?确定分配确保您在使用之前已分配
result;我想不出你还想要什么。 (我可能只是在这里想象失败......) -
是的,它可以帮助程序员避免 NPE。
-
“它可以帮助程序员避免 NPE” 但是在这种情况下你会得到什么 NPE?
-
这只是一个例子。
标签: java functional-programming