谈NullObject模式

 谈NullObject模式

转自:http://www.blogjava.net/killme2008/archive/2007/07/31/133628.html 

    知道这个模式还是通过《重构》,这个模式的出现还是了为了解决代码重复的坏味道。在项目中很经常见到类似下面这样的代码:
if (prj.getProjectId == null )
    plan.setCost(
0.0 );
else
    plan.setCost(prj.getCost());

   我们在很多地方有类似的检查对象是否为null,如果为null,需要一个默认值等等这样的场景。显然,代码重复是坏味道,怎么消除这个坏味道呢?答案就是使用NullObject替代之,Null Object继承原对象。
class  NullProject  extends  Project{
   
public   boolean  isNull(){
      
return   true ;
   }
}
class  Project{
   
private   double  cost;
   
private  String projectId;
   .
   
public   boolean  isNull(){
        
return   false ;
   }
}

那么,原来的代码可以改写为:
if (prj.isNull())
    plan.setCost(
0.0 );
else
    plan.setCost(prj.getCost());

    如果Null Object的引入仅仅是带来这个好处,似乎没有理由让我们多敲这么多键盘。问题的关键是类似上面这样的判断也许出现在很多处,那么有价值的技巧出现了,我们在NullObject覆写getCost,提供缺省值:
class  NullProject  extends  Project{
   
public   boolean  isNull(){
      
return   true ;
   }
   
public   double  getCost(){
      
return   0.0 ;      
   }
}
    因此,检查对象是否为null的代码可以去掉if...else了:
plan.setCost(prj.getCost());

    请注意,只有那些大多数客户端代码都要求null object做出相同响应时,这样的行为才有意义。比如我们这里当工程id为null,很多地方要求费用就默认为0.0。特殊的行为我们仍然使用isNull进行判断。
    当然,另外在需要返回NullObject的地方,你应该创建一个null object以替代一般的对象,我们可以建立一个工厂方法:

class  Project{
   
private   double  cost;
   
private  String projectId;
   .
   
public   boolean  isNull(){
        
return   false ;
   }
   
public  Project createNullProject(){
        
return   new  NullProject();
   }
}

   Null Object模式带来的好处:减少了检查对象是否为null的代码重复,提高了代码的可读性,通常这些Null Object也可以为单元测试带来简便。
转者评:null,就是引用为空,就是无引用的对象,这种情况在抽象空间中不是没有,但在实际项目中处理的,往往不是所谓真正的虚空,而是代表一种特例,它无所谓是1还是0,只要它能标识一种与众不同的状态就可以了,然而语言级别在null上的表现与普通对象的处理过于区分,不利于写出直截了当的代码,所以,建议少用null,而用一种特殊的状态标识来处理它,那可以是nullObject,或者somethingelseOjbect,whatever,只要它可以标识,就行了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值