java1.7的 -- 在Java中如何优雅地判空(并未完全解决,共同思考)

在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;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值