最近工作上有個同事很愛用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
。
參考:
沒有留言:
張貼留言