`
fengzl
  • 浏览: 215566 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

NullObject模式

阅读更多
java 代码
  1. if(prj.getProjectId==null)  
  2.     plan.setCost(0.0);  
  3. else  
  4.     plan.setCost(prj.getCost());  

我们在很多地方有类似的检查对象是否为null,如果为null,需要一个默认值等等这样的场景。显然,代码重复是坏味道,怎么消除这个坏味道呢?答案就是使用NullObject替代之,Null Object继承原对象。

java 代码
 
  1. class NullProject extends Project{  
  2.    public boolean isNull(){  
  3.       return true;  
  4.    }  
  5. }  
  6. class Project{  
  7.    private double cost;  
  8.    private String projectId;  
  9.    .  
  10.    public boolean isNull(){  
  11.         return false;  
  12.    }  
  13. }  

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

   如果Null Object的引入仅仅是带来这个好处,似乎没有理由让我们多敲这么多键盘。问题的关键是类似上面这样的判断也许出现在很多处,那么有价值的技巧出现了,我们在NullObject覆写getCost,提供缺省值:

java 代码
 
  1. class NullProject extends Project{  
  2.    public boolean isNull(){  
  3.       return true;  
  4.    }  
  5.    public double getCost(){  
  6.       return 0.0;        
  7.    }  
  8. }  

因此,检查对象是否为null的代码可以去掉if...else了:
java 代码
  1. plan.setCost(prj.getCost());  

   请注意,只有那些大多数客户端代码都要求null object做出相同响应时,这样的行为才有意义。比如我们这里当工程id为null,很多地方要求费用就默认为0.0。 特殊的行为我们仍然使用isNull进行判断。
    当然,另外在需要返回NullObject的地方,你应该创建一个null object以替代一般的对象,我们可以建立一个工厂方法:
java 代码
 
  1. class Project{  
  2.    private double cost;  
  3.    private String projectId;  
  4.    .  
  5.    public boolean isNull(){  
  6.         return false;  
  7.    }  
  8.    public Project createNullProject(){  
  9.         return new NullProject();  
  10.    }  
  11. }  

Null Object模式带来的好处:减少了检查对象是否为null的代码重复,提高了代码的可读性,通常这些Null Object也可以为单元测试带来简便。
分享到:
评论

相关推荐

    NullObject模式研究 (2013年)

    在许多面向对象的程序设计...NullObject模式能够用来解决这一问题。本文阐述了NullObject模式及其实现方式,针对空目标的单一实例化策略,给出了改进措施。NullObject模式对去除重复检测和减少空引用异常有较明显的效果。

    敏捷软件开发:原则、模式与实践

    第17章 NULL OBJECT模式 第18章 薪水支付案例研究:第一次迭代开始 第19章 薪水支付案例研究:实现 第四部分 打包薪水支付系统 第20章 包的设计原则 第21章 FACTORY模式 第22章 薪水支付案例研究(第2部分) 第五...

    C#对象为Null模式(Null Object Pattern)实例教程

    **C#对象为Null模式(Null Object Pattern)** 在软件开发中,经常遇到的一个问题是对象可能为null。这种情况下,如果我们尝试调用该null对象的方法或属性,就会引发`NullReferenceException`异常。为了解决这个问题...

    敏捷软件开发原则、模式与实践 C#版

    第21章 COMMAND模式和ACTIVE OBJECT模式:多功能与多任务 第22章 TEMPLATE METHOD模式和STRATEGY模式:继承和委托 第23章 FACADE模式和MEDIATOR模式 第24章 SINGLETON模式和MONOSTATE模式 第25章 NULL OBJECT模式 ...

    敏捷软件开发:原则、模式与实践.pdf

    第十七章 NULL OBJECT模式 第十八章 薪水支付案例研究:第一次迭代开始 第十九章 薪水支付案例研究:实现 第Ⅳ部分 打包薪水支付系统 第二十章 包的设计原则 第二十一章 FACTORY模式 第二十二章 薪水支付案例研究...

    敏捷软件开发:原则、模式与实践.pdf

    第17章 NULL OBJECT模式 第18章 薪水支付案例研究:第一次迭代开始 第19章 薪水支付案例研究:实现 第四部分 打包薪水支付系统 第20章 包的设计原则 第21章 FACTORY模式 第22章 薪水支付案例研究(第2部分) 第五...

    如何在Java中优雅地判空详解

    首先,我们需要了解什么是NullObject模式。NullObject模式是一种设计模式,用于解决判空问题。在面向对象语言中,对对象的调用前需要使用判空检查,来判断这些对象是否为空,因为在空引用上无法调用所需方法。空对象...

    使用并行扩展附加功能中的管道

    4. **NullObject模式的应用**:当某个处理阶段无法执行时,可以使用NullObject模式的类作为替代,保证Pipeline的连续性,不会因为某个环节的缺失而导致整个处理流程中断。 5. **SQL Server集成**:在数据处理中,...

    c#编码规范

    9. **NullObject模式**: 避免频繁的null检查,通过提供默认或空对象,简化逻辑处理。 #### 重构工具 为了高效地进行重构,可以借助以下工具: 1. **SourceMonitor**: 定期监控代码质量,设定并保存质量检查点。 2...

    Effective_CSharp

    15. **利用“nameof”配合“NullObject”模式**:当检查对象是否为null时,使用`nameof`来获取属性名,结合NullObject模式提供更优雅的错误处理。 16. **利用“nameof”在异常消息中传递更多信息**:在抛出异常时,...

    23种java版设计模式源码案例.zip

    23种java版设计模式源码案例.zip 0.目录 创建型模式(creational) 简单工厂(simplefactory) 动态工厂(dynamic) ...空对象模式(null object) 策略模式(strategy) 模板模式(template) 访问者模式(visitor)

    用Java实现23种设计模式

    空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 MVC 模式(MVC Pattern) 业务代表模式(Business Delegate ...

    33种JAVA设计模式DEMO

    空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。 ...

    二十三种设计模式【PDF版】

    主要是介绍各种格式流行的软件设计模式,对于程序员的进一步提升起推进作用,有时间可以随便翻翻~~ 23种设计模式汇集 如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 ...

    设计模式-空对象模式

    它引入了一个“占位符”对象,即空对象(Null Object),这个对象的行为与真实对象相似,但不会引发错误或异常。当真实对象不存在时,空对象可以无缝地接替其职责,提供一种默认或无操作的行为。 在实现空对象模式...

Global site tag (gtag.js) - Google Analytics