做爱动态图

V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mightofcode
V2EX  ›  Java

JAVA8 的 Optional 是鸡肋

  •  
  •   mightofcode · 33 天前 · 8610 次点击
    这是一个创建于 33 天前的主题,其中的信息可能已经有所发展或是发生改变。
    对于处理 NPE 问题基本没有帮助

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

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

    本质上 java 要在 null 上做优化只能通过底层语言设计上做改进(比如 Rust ),然而由于兼容性的需要,这条路已经走不通了
    第 1 条附言  ·  33 天前
    1,Optional 会有个警告提示你判空,但是这个只是警告,是非强制的

    2,没有 Optional 我可以选择判空、不判空,有了 Optional 我还是可以选择判空、不判空,只是多了个警告而已,而且代码还变难读了!

    3,入参用 Optional 还是不用?如果真这么好用,那么入参也应该用用起来啊,但是稍微想想就知道入参绝不适合用 Optional

    Optional 解决了一个无关紧要的小问题,带来的是可读性的下降,真的是鸡肋
    118 条回复    2021-01-27 20:09:28 +08:00
    1  2  
    James369
        101
    James369   32 天前
    非常的好用,我都恨 C++不引入 Optional
    wutiantong
        102
    wutiantong   32 天前
    @James369 C++有 optional 呀( )
    James369
        103
    James369   32 天前
    @wutiantong 在我看来这只是类层面的曲线救国的实现,没有语法糖来得甜。比如 swift 中的 optional,语言自带,很简洁很爽。
    James369
        104
    James369   32 天前
    @wutiantong kotlin/swift 才是真正的爽,c++/java 都是后天弥补。
    yazinnnn
        105
    yazinnnn   32 天前
    不如一步到胃引入 either ,变得更函数式一些
    wutiantong
        106
    wutiantong   32 天前
    @James369 曾经也写过 swift,链式的?和??的设计确实不错。但代码中过多的感叹号和问号真的会影响观感和可读性。

    究其根源在于他们的标准库从上一代( Obj-C,Java )一脉相承,里面难免带入了很多 nullable 语义,导致实际代码中 optional 类型极度泛滥。

    反观现代 C++,在最佳实践中大部分类型都遵循值语义,天然是非空的,所以根本就不需要考虑 optional 操作,只有在你需要 optional 语义的地方才会引入 optional 类型。所以可读性方面反而明显更佳。
    tairan2006
        107
    tairan2006   32 天前
    Rust 最好,强制你用…swift 那种也挺好,比较方便…

    Java 这个只能在链式操作上用,就一般般了…

    而且用 ide 写 if(x != null)并不是很麻烦,Golang 还一步一检查 if err != nil 呢…
    djFFFFF
        108
    djFFFFF   32 天前
    用过 Scala 的 Option 之后,确实觉得 Java 的 Optional 有点鸡肋。
    hahasong
        109
    hahasong   32 天前
    Optional 不是 swift 里的么,理想很美好,搬过来没那味了
    psyche
        110
    psyche   32 天前
    我们项目里面就用了很多 Optional,如果下属返回个 null == Optional,第一次可以教,屡教不改的叫他滚就行。如果是隔壁合作的项目组,我自己没权限开人,可以要求上司换人合作,他不走我走呗。
    楼主所在的项目组很难招到靠谱的人吗?如果是的话建议跳槽。
    人生苦短,为这些事情烦恼挺无聊的。
    yannxia
        111
    yannxia   32 天前
    用 Optional == null 都算是没什么必要的改造,Option.fromNullable(xxx).map().map().map().else() 才需要
    ztcaoll222
        112
    ztcaoll222   32 天前 via Android
    能做到明明返回是 optional 结果还要调用的人判断是否为 null 的人不赶紧开了留着害人?
    chocotan
        113
    chocotan   32 天前
    “我在工作中从没见到有项目使用 Optional
    除了使用 java stream 不得不用到 Optional”
    我在工作中见到很多项目使用 Optional
    除了使用 java stream 外,很多地方都在用 Optional
    James369
        114
    James369   32 天前
    @wutiantong swift 的链式写法,as?类型转换,try?尝试等等,真的节省很多冗余代码。我觉得真的爽。
    zeni123
        115
    zeni123   32 天前 via iPhone
    Optional 还是挺好用的 代表了另一种编程思想 可能楼主不习惯 不是一定要用不可
    by73
        116
    by73   31 天前
    这不是优化吧,只是单纯的想解决 NPE 问题,只是 Java 提供的方案有点不太好看罢了。如果用 IDEA 的话,可以用一些 @Notnull 注解让 IDEA 帮你稍微看一眼(好像是这个)。

    实际上这种东西都是希望帮你在编译期解决一些潜在的问题罢了,像 Optional,万一哪个地方就是忘了进行判断呢? Rust 诞生基本也是这种思路,只是更加强制。不过 Optional 总体思路是好的,只是在 Java 上是有点“啰嗦”,我猜你工作中应该或多或少都会应用一些避免 NPE 的方式,所以才不需要 Optional,这都只是权衡罢了。
    deepreader
        117
    deepreader   31 天前
    建议楼主入门一下 monad
    ychost
        118
    ychost   31 天前
    还行吧和 stream 一起来舒服多了
    Optional.ofNullable(records)
    .filter(v -> v.size() > 0)
    .map(Collection::stream)
    .orElseGet(Stream::empty)
    .filter(Objects::nonNull)
    .map(v -> v.get(column))
    .filter(Objects::nonNull)
    .map(String::valueOf)
    .findFirst()
    .orElse(null);
    1  2  
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2848 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:09 · PVG 22:09 · LAX 06:09 · JFK 09:09
    ♥ Do have faith in what you're doing.