在学习java动态代理,看到Proxy类中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的有什么差别呢
其实javaAPI文件就有说明了,主要就是用来验证方法输入参数是否为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()判断传入参数是否为null了,
好处是可读性佳,从名称就可以清楚知道的接收得参数应为null,且可直接给定错误信息。搭配写在方法的开头位置,可链到fail-fast的设计目的
而java 8 可以用Optional.of(T val)替代,例如:
public Foo(Bar bar) {
this.bar = Optional.of(bar).get();
// or
this.bar = Optional.of(s).orElseThrow(() -> new NullPointerException("bar cannot be null"));
}