返回 null 值,基本上是在给自己增加工作量,也是给调用者添乱。只有一处没有检查返回的是否为 null,程序就会抛 NullPointerException 异常。

如果你打算在方法中返回 null 值,不如:

  • 抛出异常,或者返回特例对象。
  • 如果你在调用某个第三方 api 中可能返回 null 值的方法,可以考虑用新方法中进一步打包(封装)这个方法,在更上层的代码中抛出异常或返回特例对象;

如下的一段代码:

List<Employee> employees = getEmployees();
if (employees != null) {
for (Employee employee : employees) {
totalPay += employee.getPay();
}
}

之所以这样处理,自然 getEmployees() 可能返回 null,不妨对 getEmployees 函数做进一步的封装:

public List<Employee> getNoNullEmployees() {
List<Employee> employees = getEmployees();
if (employees == null) {
return Collections.emptyList();
}
return employees;
}

1. Special Case : 特例模式

该模式的类图如下:

特例类同样继承自普通基类,只是其封装的是异常处理。

我们将如下两种不友好的(返回 null 或特殊值的异常处理),改造为特例类的处理方式:

// 不要返回 null
class MissingCustomer implements Customer {
public Long getId() {
return null;
}
}
// 不要返回特殊值
class MissingCustomer implements Customer {
public Long getId() {
return 0;
}
}

而是采用如下的方式(抛出有意义的特殊异常):

class MissingCustomer implements Customer {
public Long getId() throws MissingCustomerException {
throw new MissingCustomerException();
}
}

2. 特例类的默认方法

特例类封装了异常处理,有时当异常发生时,我们并不想让程序直接崩溃退出,而是继续运行下去。此时在特例类中,还需给出当异常情况发生时,特例实例的异常处理方式:

class MissingSprite implements Sprite {
public void draw() {
// draw nothing or a generic something.
}
}

references

特例模式(Special Case Pattern)与空对象模式(Null Pointer Pattern)—— 返回特例对象而非 null的更多相关文章

  1. Day 13 可迭代对象,迭代器对象,for循环迭代,生成器对象,枚举对象

    一.迭代器概念:# 器:包含了多个值的容器# 迭代:循环反馈(一次从容器中取出一个值)# 迭代器:从装有多个值的容器中一次取出一个值给外界# ls = 'abcdef'ls = [1, 2, 3, 4 ...

  2. 被遗忘的设计模式——空对象模式(Null Object Pattern)

    GoF(四人帮)那本<设计模式 可复用面向对象软件的基础>可谓是设计模式方面的经典之作,其中介绍的23种设计模式, 也可谓是经典中的经典.但是,设计模式的种类绝不仅仅是这23种,除此之外还 ...

  3. 设计模式:空对象模式(Null Object Pattern)

    设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...

  4. 空对象模式(Null Object Pattern)

    空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系.(消除如if(Object == null) 这样的检查null实例代码) 例子: public abstract ...

  5. 设计模式のNullObjectPattern(空对象模式)----行为模式

    一.产生背景 在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查.Null 对象不是检查空值,而是反应一个不做任何动作的关系.这样的 Null 对象也可 ...

  6. Java进阶篇设计模式之十三 ---- 观察者模式和空对象模式

    前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...

  7. Java设计模式之十三 ---- 观察者模式和空对象模式

    前言 在上一篇中我们学习了行为型模式的备忘录模式(Memento Pattern)和状态模式(Memento Pattern).本篇则来学习下行为型模式的最后两个模式,观察者模式(Observer P ...

  8. Java 空对象设计模式(Null Object Pattern) 讲解

    转自:http://www.cnblogs.com/haodawang/articles/5962531.html 有时候我们的代码中为避免 NullPointerException 会出现很多的对N ...

  9. 设计模式之空对象模式(php实现)

    github地址:https://github.com/ZQCard/design_pattern /** * 在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象 ...

随机推荐

  1. C#:DateTime格式增减时间

    DateTime time = DateTime.Now(); DateTime XMinutesrLater = time.AddMinutes(X); // X分钟以后的时间,即在当前时间基础上增 ...

  2. nodejs入门-做一个代理服务器

    看到node.js的httpServer和http.request,第一个想法居然是可以用它做一个代理服务器下面代码,实现了代理的基本功能,通过网络的代理设置将你的浏览器的请求转到这个httpServ ...

  3. Javascript中call()和apply()的用法 ----1

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  4. grads 新老版本目录对比

    最近不少人都在使用OpenGrADS,最新的版本已经更新到了2.0.a9,具体grads做了哪些更新,在附件里面放了一个,是英文的. 很多人说在使用原来的一些教程的时候找不到相对应的文件夹了,其实仔细 ...

  5. C# Winform 窗体传值 利用委托 子窗体传值给父窗体

    常用的Winform窗体传值有两种方式. 1.更改Form.designer.cs文件,将控件的设为Public,供子窗体访问. 在designer.cs文件的最后,找到你的控件声明. private ...

  6. this()必须放在构造方法的第一条

    public class A { String name; int age; public A() { this("Jack",23); } public A(String nam ...

  7. zabbix监控windows

    windows  版zabbix_agent下载地址: https://www.zabbix.com/download_agents 解压,有bin和conf两个文件夹 配置: 在windows被监控 ...

  8. Spring_自动装配

    Beans-autowire.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns=& ...

  9. Apache配置的5个技巧

    AcceptMutex Apache 1.3.21和Apache 2.0中引入了AcceptMutex 指示符,该指示符给调节服务器的性能带来了一个难得的机会.该指示符配置Apache的accept( ...

  10. EF Code-First 学习之旅 从已存在的数据库进行Code First

    namespace EFDemo { using System; using System.Data.Entity; using System.ComponentModel.DataAnnotatio ...