特例模式(Special Case Pattern)與空對象模式(Null Pointer Pattern)—— 返回特例對象而非 null

返回 null 值,基本上是在給本身增長工做量,也是給調用者添亂。只有一處沒有檢查返回的是否爲 null,程序就會拋 NullPointerException 異常。php

若是你打算在方法中返回 null 值,不如:api

  • 拋出異常,或者返回特例對象。
  • 若是你在調用某個第三方 api 中可能返回 null 值的方法,能夠考慮用新方法中進一步打包(封裝)這個方法,在更上層的代碼中拋出異常或返回特例對象;

以下的一段代碼:wordpress

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 : 特例模式

該模式的類圖以下:spa


這裏寫圖片描述

特例類一樣繼承自普通基類,只是其封裝的是異常處理。code

咱們將以下兩種不友好的(返回 null 或特殊值的異常處理),改造爲特例類的處理方式:對象

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

而是採用以下的方式(拋出有意義的特殊異常):blog

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

相關文章
相關標籤/搜索