JAVA8 的 Optional 是鸡肋

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

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

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

本质上 java 要在 null 上做优化只能通过底层语言设计上做改进(比如 Rust ),然而由于兼容性的需要,这条路已经走不通了
13116 次点击
所在节点    Java
118 条回复
LGA1150
2021-01-25 20:17:30 +08:00
@Vedar #57 new 操作也是可以被优化掉的,有个 JVM 开关是 EliminateAllocations (标量替换),默认打开的
namelosw
2021-01-25 20:21:54 +08:00
Java 的 Optional 和 Rust 的区别不大, 可读性下降是因为缺对应的 monadic 语法糖 . 能把?.之类的语法变换成 map 和 flatMap. 这个 Java 想加也能加, 其实就是 Scala 的 for 语法.

Rust 和 Java 不兼容的地方是 borrow checker, 但是和你说的这个问题没有关系.

同理还有 Stream / Future 之类的和 async await 的关系.
hantsy
2021-01-25 20:35:12 +08:00
@cigarzh 可读性很多时候是个人问题习惯而已。Scala 的语法可读性好吗?不照样有一群忠实粉丝。

Optional/Stream/Function/Labmda,Future 等,正经项目用过一次就习惯了,你再也不想回去了。

至于讨论“XXX 是鸡肋”这个问题本身就是鸡肋。

如果对于一种语言新语法,讨论如果使用,与其他语言对应的语法缺少什么,有什么优点,那还算一个帖子有点正面意义。

国内所有论坛的帖子,最多的就是在一些扯蛋的问题上撕逼。
fpure
2021-01-25 20:38:58 +08:00
Java 的 Optional 最大的问题是即使有 Optional,你依然必须给对象判 null,因为 Java 允许空指针就已经给类型系统打了一个洞了,这时候是否使用 Optional 就意义不大了,确实算鸡肋
sampeng
2021-01-25 20:47:02 +08:00
@mightofcode 你这就属于抬杠了,上下文意思是空指针异常啊…
sampeng
2021-01-25 20:52:09 +08:00
@mightofcode 再说了,你认为警告没用,那是你们代码没有 review,没有静态代码检查,没有很多强制性的要求。放飞自我随便写那确实没啥区别。对于很多开发而言,在学习语言编程的一节课或者说被教育的第一件事:不要忽略警告提示。

编码调试阶段只有两个信息,错和没错。没有中间那档。
Vedar
2021-01-25 21:13:56 +08:00
@LGA1150 受教了 jit 还有这个功能 才知道 看了下 这个只能替换没有逃逸的对象吧,实际上 optiona 大多 l 作为函数返回值,还是优化不了的
AItsuki
2021-01-25 21:32:23 +08:00
还行吧,optional 通过链式调用的时候是能提升阅读性的,例如 a.b().c().d()任何一环都有可能是空的情况。这种时候使用 optional 就很优雅。其他就见仁见智了。
Kaiv2
2021-01-25 22:16:21 +08:00
@AItsuki
Optional.ofNullable(a)
.map(type::b)
.map(type::c)
.map(type::d)
.orElse((type)null);

Optional 个人感觉很好用,刚开始可能不习惯,思维模式转变后发现真香
Kaiv2
2021-01-25 22:23:18 +08:00
@Kaiv2 这个例子看看不用 Optional 需要几次手动判空
lululau
2021-01-25 22:25:21 +08:00
还有人说 Stream API 比 for (int i=0; i <n; i++) 可读性低呢
casillasyi
2021-01-25 23:04:19 +08:00
v 站人均 jdk 开发者水平了吗?难读了,你这个结论是来自你自己的感觉还是有数据支撑?
WispZhan
2021-01-25 23:06:08 +08:00
Optional 设计初衷是给 Lambda 和 Stream 用的,并不是单纯给你来判空与否的。
casillasyi
2021-01-25 23:08:42 +08:00
“如果真这么好用,那么入参也应该用用起来啊。” 这前后有因果关系吗?你认真看过原作者的建议吗?

“但是这个只是警告,是非强制的。” 我就非要用 new 一个空对象出来,然后让他在某个地方空指针,反正编译过了就行。是不是一个意思?

你这样的心态,建议不要写 Java 了,去写某一个什么都给你安排的好好的语言。
LGA1150
2021-01-25 23:36:43 +08:00
@Vedar JIT 也会内联方法的,内联了就可以做优化
no1xsyzy
2021-01-26 00:24:56 +08:00
同理 Checked exceptions 也一样,Python 不也能正常错误处理吗?
但为什么还是推荐 Checked exceptions 呢?
这是协作的问题,不是业务逻辑的问题
但是,缺乏语法糖也是一个问题。

另外,入参的问题,Optional 是协变的,所以不会用于入参……
siweipancc
2021-01-26 09:10:40 +08:00
舌战群儒:D
passerbytiny
2021-01-26 09:15:37 +08:00
不想用 Stream 方式写代码,别说自己会 Java8 。

自己没见过就说没用,别说自己会 Java 。
cheng6563
2021-01-26 09:25:23 +08:00
Java 缺的是个 Notnull 标记而不是 Nullable 标记,这里看 Optional 挺鸡肋的,更不用说 Optional 自己还可能为 null
masterclock
2021-01-26 09:58:57 +08:00
在返回要求 Optional 的函数里返回 null 的程序员是不是应该开除?

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

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

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

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

© 2021 V2EX