JAVA8 的 Optional 是鸡肋

2021-01-25 15:00:29 +08:00
 mightofcode
对于处理 NPE 问题基本没有帮助

不使用 Optional,你得判空
使用 Optional,你还是得判空,只是换了一种形式
引入 Optional 降低代码可读性,代码变得丑陋

我在工作中从没见到有项目使用 Optional
除了使用 java stream 不得不用到 Optional

本质上 java 要在 null 上做优化只能通过底层语言设计上做改进(比如 Rust ),然而由于兼容性的需要,这条路已经走不通了
12615 次点击
所在节点    Java
118 条回复
LGA1150
2021-01-25 18:07:06 +08:00
#31 如果你依赖 isPresent 和 get 方法,那就和传统的 != null 没区别
真正有用的是 ifPresent, ifPresentOrElse, orElseGet 等的函数式方法
shyling
2021-01-25 18:10:01 +08:00
@mightofcode std::mem::transmute 有话说
Jirajine
2021-01-25 18:14:21 +08:00
@mightofcode 概念是一致的,给警告也算静态检查了,只要你不忽略警告,再就是它提供的那些 combinator 方法。
kotlin 也分 nullable type,概念也是一样的,可能语法上好一点。
hantsy
2021-01-25 18:18:27 +08:00
@yazinnnn 太弱?

不,大约 5,6 年前,开始试用 Java8 的时候, 发现 Scala 没那么吸引人了。

我在 Spring 项目中第一次大规模使用 Java 8 的 Function/Consumer/Supplier 是应用 Spring Integrations 4 的 Java 8 DSL,当时它是单独的模块,现在是 Spring Integration 5 核心的一部分了。

https://spring.io/blog/2014/11/25/spring-integration-java-dsl-line-by-line-tutorial
hantsy
2021-01-25 18:21:23 +08:00
@1011 跟业务设计有毛线关系啊。

代码换个写法而已,不喜欢依然可以传统的方式。
otakustay
2021-01-25 18:49:30 +08:00
最根源的问题还是`null`是一个值而不是一个类型
KarmaWu
2021-01-25 18:56:31 +08:00
Optional 判空还是挺香的,你可以不用,但是它存在即是合理
mightofcode
2021-01-25 18:57:57 +08:00
@KarmaWu 香在哪?既然合理,麻烦给一个合理分析
nthin0
2021-01-25 18:59:28 +08:00
@chenfcheng 这样不行吧,得用.map(xx::getXXX),否则其中一个为 null 的时候还是会抛空指针
bigbigeggs
2021-01-25 19:30:22 +08:00
主要是强制吧,和自己 xx == null 来进行判断。
直接抛异常,他不香么
ilumer
2021-01-25 19:38:24 +08:00
Vedar
2021-01-25 19:42:31 +08:00
确实挺蛋疼的 主要还是因为不是 zero cost 的 所以还是很少用 除了一些必须要用的地方比如和 stream 交互的地方
Vedar
2021-01-25 19:48:45 +08:00
另外 java 自带的 optional 不支持序列化 有时候也挺烦的
taojintianxia
2021-01-25 19:49:39 +08:00
就是因为大量人员不做判空导致大家都在写防御性代码。第三方或者前端的数据我们无法保证一定非空,但是内部接口调用,我们难道无法保证参数是否为空吗。
LGA1150
2021-01-25 19:50:31 +08:00
@Vedar #52 JIT 会优化的
young1lin
2021-01-25 19:57:06 +08:00
怎么缩呢,这个其实有点用。Spring 源码就用到了这个,在 DefaultListableBeanFactory 这个类里面好像。可以进行流式判断,确实能省好多代码,就是没仔细学过 Java8 的容易懵逼。
Vedar
2021-01-25 19:58:13 +08:00
@LGA1150 这怎么优化? jit 会将热点代码编译成机器码来提高速度 但是内存的申请和释放还是一样的呀,optional 包了一层对象 增加了 gc 压力 这不是一定的么
cigarzh
2021-01-25 20:01:28 +08:00
> 给你,你说鸡肋
> 不给,你说缺失
我觉得还挺有道理的,不过我也反对降低代码可读性来做防御式编程
Aimers
2021-01-25 20:04:32 +08:00
kt 大法好
blackboom
2021-01-25 20:09:55 +08:00
个人感觉 Optional 非常普遍啊?🤔🤔 如果使用 Spring boot 的话,随便找一找都是 Optional 的影子。

如果某个接口返回 Optional 说明调用方需要判空,返回一定有值为什么要使用 Optional API ?

在 Java 中 Optional 绝对不是鸡肋,并且很好用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/748167

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX