美文网首页
java 如何优雅地处理空值

java 如何优雅地处理空值

作者: 飞鹰雪玉 | 来源:发表于2021-06-10 18:06 被阅读0次

场景

存在一个UserService用来提供用户查询的功能。

public interface UserService(){
        List<User> list();
        User getUser(Integer id);
}

疑惑

list():如果没有数据,返回null还是空集合?
getUser(Integer id):如果没有对应id的用户,返回null还是抛一个异常?

分析

先分析list()

一般实现有这样:

        public List<User> list(){
            List<User> userList = userMapper.list();
            if (userList.size() == 0){
                return null;
            }
            return userList;
        }

这段代码返回是null, 对于集合这样返回值,最好不要返回null,因为如果返回了null,会给调⽤者带 来很多麻烦。你将会把这种调用风险交给调用者来控制。
如果调用者是⼀个谨慎的⼈,他会进⾏是否为null的条件判断。如果他并⾮谨慎,或者他是⼀个⾯向接⼝编程的狂热分⼦(当然, ⾯向接⼝编程是正确的⽅向),他会按照⾃⼰的理解去调⽤接⼝,⽽不进⾏是否为null的条件判断,如果这样的话,是⾮常危险 的,它很有可能出现空指针异常!

为此我们进行优化:

        public List<User> list(){
            List<User> userList = userMapper.list();
            if (userList.size() == 0){
                return new ArrayList<>();
            }
            return userList;
        }

对于list()接口来说,它⼀定会返回List,即使没有数据,它仍然会返回List(集合中没有任何元素);
通过以上的修改,我们成功的避免了有可能发⽣的空指针异常,这样的写法更安全!

getUser(Integer id)

一般实现方式有以下

        public User getUser(Integer id){
            return userMapper.selectById(id);
        }

通过代码的时候得知它的返回值很有可能是null! 但我们通过的接⼝是分辨不出来的! 这个是个⾮常危险的事情。尤其对于调⽤者来说!
解决方案一:
在接口说明时补充⽂档,⽐如对于异常的说明,使⽤注解@exception:

        /**
         * 根据id获取用户对象
         * @param 用户id
         * @return 用户对象
         * @exception UserNotFoundException
         */
        User getUser(Integer id);

我们把接⼝定义加上了说明之后,调⽤者会看到,如果调⽤此接⼝,很有可能抛出UserNotFoundException这样的异常。这种⽅式可以在调⽤者调⽤接⼝的时候看到接⼝的定义,但是,这种⽅式是“弱提⽰”的!如果调⽤者忽略了注释,有可能就对业务系统产⽣了⻛险,这个⻛险有可能导致⼀个亿!

解决方案二:
引⼊jdk8的Optional,或者使⽤guava的Optional

        /**
         * 根据id获取用户对象
         * @param 用户id
         * @return 用户对象
         */
        Optional<User> getUser(Integer id);

Optional有两个含义: 存在 or 缺省。
实现

        public Optional<User> getUser(Integer id){
            return Optional.ofNullable(userMapper.selectById(id));
        }

相关文章

  • java 如何优雅地处理空值

    场景 存在一个UserService用来提供用户查询的功能。 疑惑 list():如果没有数据,返回null还是空...

  • Java:如何更优雅的处理空值?

    导语 在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不着头绪,它的出现很有可...

  • Java:如何更优雅的处理空值?

    在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不着头绪,它的出现很有可能和当...

  • Java到底如何更优雅的处理空值?

    来源:西格玛的博客https://lrwinx.github.io/[https://lrwinx.github....

  • java8中如何优雅的处理空值

    导语在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不着头绪,它的出现很有可能...

  • java8中如何优雅的处理空值

    引用地址:https://www.jianshu.com/p/f4c4fa2fcd9b

  • Exception

    Java 中 9 个处理 Exception 的最佳实践 Java 中的异常和处理详解 如何优雅的设计 Java ...

  • java匠人手法-优雅的处理空值

    导语 在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不这头绪,它的出现很有可...

  • java匠人手法-优雅的处理空值

    导语 在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不这头绪,它的出现很有可...

  • 在Java中如何优雅地判空

    判空灾难 作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢NullPointe...

网友评论

      本文标题:java 如何优雅地处理空值

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