網頁

2018/11/28

Java Objects.requireNonNull

最近工作上有個同事很愛用Objects.requireNonNull(T)Objects.requireNonNull(T obj, String message)來判斷傳入方法的參數是否為null並丟出錯誤訊息。

例如:

public void doSomething(String customerName, Integer age) {
    Objects.requireNonNull(customerName, "customerName cannot be null");
    Objects.requireNonNull(age, "age cannot be null");
    ...
}

但這和使用if(obj == null)判斷是否為null的有什麼差別呢?

其實Java API文件就有說明了,主要就是用來驗證方法或建構式的輸入參數是否為null,例如之前通常寫法如下:

public Foo(Bar bar) {
    if(bar == null) {
        throw new NullPointerException();
    } else {
        this.bar = bar;
    }
}

有了這個方法則可改寫為

public Foo(Bar bar) {
    this.bar = Objects.requireNonNull(bar);
}

一旦傳入的參數為null,會丟出NullPointerException

Objects.requireNonNull(T)Objects.requireNonNull(T obj, String message)是Java 7才加入的工具類,原始碼分別如下:

public static  T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}

public static  T requireNonNull(T obj, String message) {
    if (obj == null)
        throw new NullPointerException(message);
    return obj;
}

若傳入的參數不為null,則回傳原參數,因此可確保傳入的參數不為null。

簡言之就是不需要每次都要自己用if(obj == null)判斷傳入參數是否為null了,直接用此方法即可。

好處是可讀性佳,從名稱就可以清楚知道接收的參數不應為null,且可直接給定錯誤訊息。搭配寫在方法的開頭位置,可達到fail-fast的設計目的。


而在Java 8可以用Optional.of(T value)替代,例如:

public Foo(Bar bar) {
     this.bar = Optional.of(bar).get();
     // or
     this.bar = Optional.of(s).orElseThrow(() -> new NullPointerException("bar cannot be null"));
}

同樣地,若傳入Optional.of()的參數為null一樣會拋出NullPointerException


參考:

沒有留言:

張貼留言