zoukankan      html  css  js  c++  java
  • 特例模式(Special Case Pattern)与空对象模式(Null Pointer Pattern)—— 返回特例对象而非 null

    返回 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

  • 相关阅读:
    iOS NSUserDefaults 存储可变数组问题
    iOS之[文件下载 / 大文件下载 / 断点下载]
    macOS 新手开发:第 2 部分
    iOS 游戏素材
    iOS 动画
    macOS 开发
    iOS 之访问权限以及跳转到系统界面
    蓝桥杯—ALGO-18 单词接龙(DFS)
    蓝桥杯—ALGO-12 幂方分解(递归递推)
    蓝桥杯—ALGO-131 Beaver's Calculator
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9421045.html
Copyright © 2011-2022 走看看