在Java中如何优雅地判空
之前看这个文章的时候,并没有被NR Null Object这个插件吸引,相比繁琐的判空,这个并没有减少工作量,反而增加学习成本。
倒是后面Optional这个方法很是吸引我,但是可惜的是它只支持java8,那么我们怎么在java7中实现这个呢?
先贴一下Optional的使用。
//有个类叫testBean,它里面有个类叫小明,小明喜欢的玩具default值是小刀。
Optional.ofNullable(testBean)
.flatMap(TestBean :: getXiaoMing)
.flatMap(TestBean.XiaoMing ::getWanju)
.orElse("小刀");
下面是我实现的
NotNullUtil.ofNullable(testBean)
.flatMap("getXiaoMing")
.flatMap("getWanju")
.orElse("小刀");
问题
问题1
根据java8的语法,是可以自动通过TestBean ::通过代码提示获取对应的类中方法的,但是java7有没有类似的呢?我用的是通过方法名,然后反射获取。
问题2
Optional并不理想,以上面的getXiaoMing为例,不能使用正常通过快捷键生成的get和set方法,虽然可以自定义模板来简化这个过程,但是还是存在学习成本的。
通过反射的写法反而没有这个问题,但是数据类是一个使用很频繁的类,过多的反射又会带来性能上的消耗。
那么有没有两全其美的方法呢?
贴上我写的代码
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Objects;
/**
* Created by CaoZhiChao
*/
public class NotNullUtil<T> {
private final T value;
private static final NotNullUtil<?> EMPTY = new NotNullUtil<>();
private NotNullUtil(T value) {
this.value = Objects.requireNonNull(value);
}
private NotNullUtil() {
this.value = null;
}
public static <T> NotNullUtil<T> ofNullable(T value) {
return value == null ? (NotNullUtil<T>) empty() : of(value);
}
public <U> NotNullUtil<U> flatMap(String function) {
try {
Class parentClass = value.getClass();
Method method = parentClass.getDeclaredMethod(function);
U defaultValue = (U) method.invoke(value);
if (defaultValue == null) {
return empty();
}
return new NotNullUtil<>(defaultValue);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
return empty();
}
}
public T orElse(T other) {
return value != null ? value : other;
}
public static <T> NotNullUtil<T> of(T value) {
return new NotNullUtil<>(value);
}
public static <T> NotNullUtil<T> empty() {
@SuppressWarnings("unchecked")
NotNullUtil<T> t = (NotNullUtil<T>) EMPTY;
return t;
}
}