看一篇文章:10个经典的java开发原则,里面一个原则:永远不要返回NULL。

说实在的,我对这个原则体会不是很深,平时在使用对象前,检查是否为null已经成了习惯,也是我要求开发人员的一个标准动作。但是文中提的也有一定的道理。因此就拿过来讨论了下。
---------------------------------
为什么,因为很多代码都是 a.b(......).c(...) 这么连着调用。如果每层调用都要检查是否为空的话,代码就太难看了,也太麻烦了。有没有更好的解决方法呢?
但是不返回null,返回什么呢?显然要反悔一个类的实例,但是怎么保证得到的结果是预期的呢,也就是说,怎么能保证这样虽然不会报“未交对象引用设置到对象的实例”(实际上就是空引用)这个错误,但是能得到“正确”的结果呢。显然,应该是nul但是没有返回null是得不到正确的结果,但是我们要保证结果是可控的,也就是说,虽然代码顺利执行下来了,但是我们要知道实际上啥也不应该做。或者,我们要针对这种情况,返回可以接受的结果。
至于什么事可以接受的结果,这个有么有一定的原则和规律呢,还是需要具体问题具体分析呢?体育老师教的语文,自己都觉得没说明白,绕!
一类里要有个标志,表示出“虽然是个非空的实例,但是它确实代表null”这个意思。问题接着追下去,如果是这个意思的话,那么他的方法应该做什么呢?也就是要解答:如果不存在这个实例,那么这个方法应该是什么业务逻辑。搞清楚了这个,就可以写这样的代码了:
假设那个标志命名为  nullInstance;
if ( nullINstance ) then {
      不存在这个实例的业务逻辑;
}else{
     正常的业务逻辑。
}
 
这么说太抽象了,我们举个实际的例子吧。
设计如下简单场景:删除员工所属的部门,
(1)员工类:employee,
(2)员工所属部门(我们用方法来表示吧,不用属性了,为了说明问题):getDepartment()
(3)部门类:department;
(4)部门的删除方法:delete();
那么:
  getDepartment(){
      if( nullINstance  ){ //如果员工类是空的话
       return new Department( nullInstance=true ); //创建一个”空“实例;
     }
      else{
          return new department( thisd.deptID); //返回一个具体的部门类
     }
  }
 
 那么:类department.delete()的实现:
 delete(){
     if( nullINstance  ){ //如果空的话
          return ;
    else 
        执行删除方法:delete from department where deptid = 2222;
}
 
考,这也够麻烦的啊!不过麻烦我一个,方便千万人。雷锋精神永垂不朽!
是这样吗?没有把握。

一个开发原则:永远不要返回NULL的更多相关文章

  1. Effective Java 第三版——54. 返回空的数组或集合不要返回null

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  2. Android开发:getViewById返回null的原因定位

    近期在研究开发一些基于Android的App,遇到了一些问题.当中一个比較关键的是在Activity中的onCreate()方法中获取Button对象.代码大概例如以下: private Button ...

  3. Xamarin +vs2015 Android 开发GPS loaction 返回 null 小结

    最近公司要开发android 所以研究了一下Xamarin  to android 中个GPS 废话不多说,说重点. 想获取手机上的gps信息必不可少的就是要使用 LocationManager Lo ...

  4. 自动化测试用例getText()获取某一个元素的值返回null或空

    问题描述 页面上一个元素无法获取它的值. 用getText() 获取该元素的值返回null或空. 根本原因 ? 需要更多了解dom结构 解决办法 用getAttribute("value&q ...

  5. JVM加载类冲突,导致Mybatis查数据库返回NULL的一个小问题

    今天碰到个bug,虽然小,但是有点意思 背景是SpringMVC + Mybatis的一个项目,mapper文件里写了一条sql 大概相当于 select a from tableA where b ...

  6. Javascript实例教程:querySelector()方法接受一个CSS查询并返回匹配模式的第一个子孙元素,如果没有匹配的元素则返回null。

    文章简介:querySelector()方法接受一个CSS查询并返回匹配模式的第一个子孙元素,如果没有匹配的元素则返回null. querySelector()方法接受一个CSS查询并返回匹配模式的第 ...

  7. 10 位顶级 PHP 大师的开发原则

    10 位顶级 PHP 大师的开发原则 ruby_chen 发布于: 2013年03月28日 (61评) 分享到:    收藏 +139 #深圳# 6月10日 亚马逊AWSome Day云计算免费培训报 ...

  8. C#操作xml SelectNodes,SelectSingleNode总是返回NULL 与 xPath 介绍

    一. SelectNodes,SelectSingleNode总是返回NULL 下面以一个简单的xml为例: <?xml version="1.0"?> <mes ...

  9. Type.GetType()在跨程序集反射时返回null的解决方法

    在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型.如果使用稍有不慎,就会产生运行时错误.例如使用Type.GetType("BNameSpace.Class ...

随机推荐

  1. 让你提前认识软件开发(19):C语言中的协议及单元測试演示样例

    第1部分 又一次认识C语言 C语言中的协议及单元測试演示样例 [文章摘要] 在实际的软件开发项目中.常常要实现多个模块之间的通信.这就须要大家约定好相互之间的通信协议,各自依照协议来收发和解析消息. ...

  2. Android SDK三种更新失败及其解决方法

    更新Android SDK,居然失败了三次. 1.第一次失败 出现Failed to fetch URL错误提示 Failed to fetch URL https://dl-ssl.google.c ...

  3. CRC32 vs Java.HashCode

    找了容量为27万中文词库进行试验    CRC32 中冲突率 < 0.01%    而 Java.HashCode 有 4%    hashCode 的速度 应该比 CRC 快 2-3 倍 CR ...

  4. JavaScript中cookie的路径(path)和域(domain)

    cookie虽然是由一个网页所创建,但并不只是创建cookie的网页才能读 取该cookie.在默认情况下,与创建cookie的网页在同一目录或子目录下的所有网页都可以读取该cookie.但如果在这个 ...

  5. Java中 hashCode()方法详解

    先来看下Object源码里hashcode方法: /**     * Returns a hash code value for the object. This method is      * s ...

  6. myEclipse快捷键及其常用设置

    快捷键:    查找替换:ctrl + f    复制行: ctrl + alt + down    删除行: ctrl + d    插入行: shift + enter, ctrl + shift ...

  7. c# 流程控制

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. 解决Sublime Text3莫名的中文乱码问题

    有好几回用Sublime Text3写着中英混杂的文字的时候,会突然就弹出警告说什么编码不行,然后点击确定后,原来的中文全都乱码了: 然后即使按ctrl+z撤回也没用,重新打开也没用,用记事本的转换a ...

  9. 深入浅出—JAVA(10)

    10.数字与静态 静态变量是共享的.同一类所有的实例共享一份静态变量. 实例变量:每个实例一个.静态变量:每个类一个. 数字的格式化 唯一必填的项目是类型 package xiao;class Sta ...

  10. 高级UNIX环境编程7 进程

    每个程序都会收到一张环境表 extern char **environ; c程序的存储空间布局: 正文段:共享,只读 初始化数据段:存函数以外的赋值 非初始化数据段(bbs):block starte ...