java guava null_我应该使用Java8/Guava对于可能返回null的每个方法可选吗?

那么什么是可选的错误?

我们面临的问题是:JDK 8可选对象是否会去除空引用?答案是一个强调的没有!所以,诋毁者立刻质疑它的价值问:那么什么是好的,我们不能通过其他手段已经做了?

与像SML或Haskell这样从来没有空引用概念的函数语言不同,在Java中,我们不能简单地去掉历史上存在的空引用。这将继续存在,并且他们可以有其正确的用途(只提一个例子:three-valued logic)。

我怀疑可选类的意图是替换每一个可空的引用,但有助于创建更健壮的API,其中只需阅读一个方法的签名,我们可以告诉我们是否可以期望一个可选的值,强制程序员相应地使用该值。但最终,Optional将只是另一个引用,并受到语言中每个其他引用的相同弱点(例如,您可以返回null Optional)。很明显,Optional不会节省一天。

在项目lambda邮件列表中,如何使用这些可选对象或者它们在Java中是否有价值是一个heated debate的问题。从诋毁者,我们听到有趣的论点,如:

>事实上,其他替代品存在(例如IDES像IntelliJ和Eclipse IDE支持一组proprietary annotations静态分析的可空性,JSR-305与注释像@Nullable和@NonNull)。

>有些人希望它可以在functional world中使用,这在Java中是不完全可能的,因为语言缺乏在诸如SML或Haskell的函数编程语言(例如模式匹配)中存在的许多特征。

>其他人认为如何使用这个成语(例如List.get(Object),它将继续返回null)是不可能的retrofit preexisting code。

>有些人抱怨缺少对可选值的语言支持创造了一个潜在的场景,其中Optional可能是API中的used inconsistently,这是由于创建了不兼容性,这与Java API的其余部分非常相似其不能被改进以使用新的可选类。这是你的问题。在支持可选类型like in Ceylon或like in Kotlin的语言中,您甚至不会质疑这一点。

>一个引人注目的论据是,如果程序员调用可选对象中的get方法,如果它是空的,它将引发一个NoSuchElementException,这是与nulls相同的问题,只是一个不同的异常。

因此,看来Optional的好处是真的有问题,可能限制在提高可读性和执行公共接口合同。

我相信采用这个可选的功能习惯很可能使我们的代码更安全,更少的提示null解引用的问题,因此更强大,更少的错误倾向。当然,它不是一个完美的解决方案,因为,毕竟,Optional引用也可以被错误地设置为null引用,但我希望程序员坚持不传递null引用的一个可选对象的预期,我们今天考虑一个好的做法是不传递一个空引用,其中期望一个集合或数组,在这些情况下,正确的是传递一个空数组或集合。这里的要点是,现在我们在API中有一个机制,我们可以使用它来明确表示,对于给定的引用,我们可能没有值来分配它,并且用户被API强制验证。

“Besides the increase in readability that comes from giving null a

name, the biggest advantage of Optional is its idiot-proof-ness. It

forces you to actively think about the absent case if you want your

program to compile at all, since you have to actively unwrap the

Optional and address that case”.

所以,我想这是由每一个API设计师选择他们想在使用Optional多远。

一些有影响力的开发人员如Stephen Colebourne和Brian Goetz最近发表了一些有趣的文章,关于正确使用可选的。我特别发现以下有用的:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值