看一篇文章: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;
}
考,这也够麻烦的啊!不过麻烦我一个,方便千万人。雷锋精神永垂不朽!
是这样吗?没有把握。