美文网首页py.test+mock互联网科技程序员
锱铢必较:编写政治正确的代码——来聊聊java8的Optiona

锱铢必较:编写政治正确的代码——来聊聊java8的Optiona

作者: 大神带我来搬砖 | 来源:发表于2018-05-17 23:59 被阅读13924次

    java8的Optional到底有什么用呢?说起来,它比原来的null值判断有什么优势呢?

    它实际上可以看做一个容器,容器里可能有一个非null的值,也可能没有。它带来最大的好处,就是代码在语义上政治正确。代码好用不好用不要紧,政治一定要正确。

    代码好用不好用不要紧,政治一定要正确

    比如我们有个Integer类型的列表类FooList,它有两个方法,一个返回列表的长度,一个返回比传入参数小的,最大的那个值。

    在没有Optional的时候,代码如下

    public class FooList {
    
        public Integer size() {
            throw new UnsupportedOperationException();
        }
    
        public Integer maxNumberBelow(Integer upperBound) {
            throw new UnsupportedOperationException();
        }
    
    }
    

    语义上的问题在于,size方法一定会返回一个数字,maxNumberBelow则不会。如果列表是空的,size返回0,maxNumberBelow(100)该返回什么呢?

    这时大家就八仙过海,各显神通了。

    1 直接返回null。比较常用的一个方法。

    2 返回一个不合法的值。比如String里的indexOf方法,会返回一个-1。

    3 抛一个异常。比如jpa里的EntityNotFoundException。

    顺便说一句,我觉得抛异常是最不可取的形式,首先不讨论是否应该是受检异常,数据库里没有记录就抛异常好像也不符合异常的定义。数据库里查不到数据挺正常的,怎么会是异常呢?政治不正确啊。

    开发者八仙过海之后,使用者就目瞪口呆了。为什么呢?因为不管他们怎么八仙过海,方法的语义上都很难看出来开发者用的哪种神通——方法签名没办法有效的标识出它是不是每次都能返回合理的值,也没法标识出它无法返回合理的值时的行为。无法返回合理的值是什么表现?返回了null?返回了一个特殊的值?还是throw了异常?在IDE里调用方法的时候根本看不出来,只能看文档!!!
    让开发者好好写文档?不存在的!
    让开发者认真看文档?不存在的!

    为啥size返回的Integer可以肆无忌惮的使用,而maxNumberBelow返回的Integer就必须和一个奇奇怪怪的值做比较?种族歧视?
    让开发者分清楚这些?不存在的!

    所以用大家都赶紧用Optional吧,上面所有问题迎刃而解!

    public class BarList {
        public Integer size() {
            throw new UnsupportedOperationException();
        }
    
        public Optional<Integer> maxNumberBelow(Integer upperBound) {
            throw new UnsupportedOperationException();
        }
    }
    

    首先,返回值就能明确区分出,方法是每次返回合理的值还是有条件的返回合理的值。

    其次,IDE还能检查出来对Optional对象跳过isPresent直接调用get方法。

    这样,我们就写出来政治正确的代码了。

    相关文章

      网友评论

      • 孙亖:代码既正义
        大神带我来搬砖:@孙亖 对啊
      • 一起来看雷阵雨:在没有opinional以前,处理空值的任务是方法编写者,你抛异常,返回null还是用默认值(极不推荐,容易产生歧义)。而Opinional就是把空值处理的方法从函数编写者转移到了函数调用者,我告诉你可能为空,怎么处理那是你的事。这样的好处就是可以避免不必要的麻烦,把空值的处理放到了合适的位置。个人见解😁
        大神带我来搬砖:@一起来看雷阵雨 处理空值还是要两边搞,只是原来是靠猜,现在不用猜了
      • 土豆_0ee7:有啥用
      • f63f6a5e04e2:我把字数看成了阅读量。。。

      本文标题:锱铢必较:编写政治正确的代码——来聊聊java8的Optiona

      本文链接:https://www.haomeiwen.com/subject/iozfdftx.html