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

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吧,上面所有问题迎刃而解!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互联网大杂烩

设计模式(一)

确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。 优点:减少系统开销,避免对资源多重利用。 缺点:没有接口,不利于扩展。

742
来自专栏MyBlog

Effective.Java 读书笔记(2)使用Builder

静态工厂和构造器都有一个限制,它们不能够很好地缩减大量地选项参数,想象一下一种情况,你的类有着很多的成员变量,有些必须填写有些可以选填,那么如果使用传统的构造方...

482
来自专栏北京马哥教育

Python老司机也会翻车!10个最容易犯的Python开发错误

? Python是一门简单易学的编程语言,语法简洁而清晰,并且拥有丰富和强大的类库。与其它大多数程序设计语言使用大括号不一样 ,它使用缩进来定义语句块。 在平...

3478
来自专栏C/C++基础

C++注释风格建议

有个笑话,一位从不写注释的程序员在编写一段复杂的代码时,骄傲地认为这段代码只有自己和上帝知道它是干嘛的,等过了一段时间再回顾时,发现没有注释,感叹到这段代码现在...

1131
来自专栏HappenLee的技术杂谈

C++雾中风景11:厘清C++类型转换(static_cast,dynamic_cast,reinterpret_cast,const_cast)

开门见山,先聊聊笔者对类型转换的看法吧。从设计上看,一门面向对象的语言是不一样提供类型转换的,这种方式破坏了类型系统。C++为了兼容C也不得不吞下这个苦果,在实...

351
来自专栏问天丶天问

Java 8 特性

1453
来自专栏佳爷的后花媛

Java编程思想之每天两小时(二)

第一个面向对象语言Simula-67.他在程序中使用基本关键字class来引入新的类型。这个语言是为了开发诸如经典的“银行出纳员问题”(bank teller ...

582
来自专栏HappenLee的技术杂谈

C++雾中风景11:厘清C++之中的类型转换

开门见山,先聊聊笔者对类型转换的看法吧。从设计上看,一门面向对象的语言是不一样提供类型转换的,这种方式破坏了类型系统。C++为了兼容C也不得不吞下这个苦果,在实...

833
来自专栏高性能服务器开发

经典面试题(一)之服务器内存碎片

年前去过上海掌门集团(做无线wifi万能钥匙的那一家)和百度面试过一次,前者问了linux下gcc的malloc函数如何分配内存的,后者在二面时通过一个链表的数...

4518
来自专栏阮一峰的网络日志

强类型 JavaScript 的解决方案

JavaScript 是一种弱类型(或称动态类型)语言,即变量的类型是不确定的。 x = 5; // 5 x = x + 'A'; // '5A' 上面代码中,...

3365

扫码关注云+社区