前置条件检测和null处理有异曲同工之妙,也是我们天天都在做的,比如传入一个索引,我们可能需要检查他的值是不是超过了数组大小。
说白了,我们会需要写这种检测,还是因为类型系统的问题,类型系统可以限制一个类型能做的事情,却没法限制类型本身的数据。比如一个数字1,和一个数字100,他们是同一个类型,但是代表的却是不同的意义,所以我觉得,这种检测,其实也是属于类型检测的一部分,如果可以的话,我感觉也可以像kotlin处理null类型一样,写在参数里
类似这样
public void test(int a:a>0&&a<10)
{
///
}
当然,这只是我美好的设想,目前我暂时没有找到支持把这种前置条件检测写在形参块里的语言,所以我们还是只能把这种繁琐的条件检测手动写在方法体里。
虽然没有语言级别的支持,还是可以用类库,稍稍减轻一下手动编码的痛苦。
类似这种前置条件检测的类库非常多,那么guava的优势在哪里呢。
以下是guava官方自己说的,实际上我感觉用apache的也差不多
1.guava的方法名更加清楚(实际上好多程序员英文都看不怎么懂这条就忽略吧)
2.方法会返回原参数
3.参数更加简单
//手写的检测 (如果你还在这样写的话,赶快找一个库用吧)
if(someObj == null){
throw new IllegalArgumentException(" someObj must
not be null");
}
//用guava写
checkNotNull(someObj,"someObj must not be null");
public PreconditionExample(String label) {
//检查null
this.label = checkNotNull(label,"Label can''t be null");
}
public void updateCurrentIndexValue(int index, int valueToSet) {
//检查索引
this.currentIndex = checkElementIndex(index, values.length,
"Index out of bounds for values");
//检查bool
checkArgument(valueToSet <= 100,"Value can't be more than
100");
values[this.currentIndex] = valueToSet;
}
public void doOperation(){
checkState(validateObjectState(),"Can't perform operation");
}
其实和junit的类有些类似,不过guava这个是专门检查参数的,所以用起来稍微简单一些。
其实在实际编码中,我发现很多人写代码的时候,都没有写全或者根本没有写前置条件检测,甚至在很多商业项目里也是这样。这个我觉得还是要写全一点比较好,不要在等出错了再来改代码,错误就应该及早报出来,虽然确实会多写不少代码。
这个东西其实自己写个工具类估计也就十来分钟的事情,不过主要学习的是一种思想,要积极的在自己的代码里用起来,不能说是看过就算了。
欢迎关注我的github
https://github.com/luckyCatMiao