-
Guava进修笔记:Preconditions优雅的查验参数
添加时间:2013-6-17 点击量:在日常开辟中,我们经常会对办法的输入参数做一些数据格局上的验证,以便包管办法可以或许遵守正常流程履行下去。对于可预知的一些数据上的错误,我们必然要干事前检测和断定,来避免法度流程失足,而不是完全经由过程错误处理惩罚来包管流程正确履行,毕竟?成果错误处理惩罚是斗劲消费资料的体式格式。在通俗景象下我们对参数的断定都须要本身来逐个写办法断定,代码量不少并且复用性不高,如下所示:
import org.junit.Test;
public class PreconditionsTest {
@Test
public void Preconditions() throws Exception {
getPerson(8,peida);
getPerson(-9,peida);
getPerson(8,);
getPerson(8,null);
}
public static void getPerson(int age,String neme)throws Exception{
if(age>0&&neme!=null&&neme.isEmpty()!=true){
System.out.println(a person age:+age+,neme:+neme);
}else{
System.out.println(参数输入有误!);
}
}
}申明:参数验证,我们每次都要添加if语句来做断定, 反复的工作会做很多多少次。getPerson办法只有2个参数,验证规矩也不是很错杂,若是参数过度,验证规矩错杂后,上方代码的可读性都邑很差的,复用性就更谈不上了。
Guava类库中供给了一个作参数搜检的对象类--Preconditions类, 该类可以大大地简化我们代码中对于参数的预断定和处理惩罚,让我们对办法输入参数的验证实现起来加倍简单优雅,下面我们看看Preconditions类的应用实例:
import org.junit.Test;
import com.google.common.base.Preconditions;
public class PreconditionsTest {
@Test
public void Preconditions() throws Exception {
getPersonByPrecondition(8,peida);
try {
getPersonByPrecondition(-9,peida);
} catch (Exception e) {
System.out.println(e.getMessage());
}
try {
getPersonByPrecondition(8,);
} catch (Exception e) {
System.out.println(e.getMessage());
}
try {
getPersonByPrecondition(8,null);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public static void getPersonByPrecondition(int age,String neme)throws Exception{
Preconditions.checkNotNull(neme, neme为null);
Preconditions.checkArgument(neme.length()>0, neme为\\);
Preconditions.checkArgument(age>0, age 必须大于0);
System.out.println(a person age:+age+,neme:+neme);
}
}运行成果:
a person age:8,neme:peida
age 必须大于0
neme为
neme为nullPreconditions里面的办法:
1 .checkArgument(boolean) :
功能描述:搜检boolean是否为真。 用作办法中搜检参数
失败时抛出的异常类型: IllegalArgumentException2.checkNotNull(T):
功能描述:搜检value不为null, 直接返回value;
失败时抛出的异常类型:NullPointerException
3.checkState(boolean):
功能描述:搜检对象的一些状况,不依附办法参数。 例如, Iterator可以用来next是否在remove之前被调用。
失败时抛出的异常类型:IllegalStateException
4.checkElementIndex(int index, int size):
功能描述:搜检index是否为在一个长度为size的list, string或array合法的局限。 index的局限区间是[0, size)(包含0不包含size)。无需直接传入list, string或array, 只需传入大小。返回index。
失败时抛出的异常类型:IndexOutOfBoundsException
5.checkPositionIndex(int index, int size):
功能描述:搜检地位index是否为在一个长度为size的list, string或array合法的局限。 index的局限区间是[0, size)(包含0不包含size)。无需直接传入list, string或array, 只需传入大小。返回index。
失败时抛出的异常类型:IndexOutOfBoundsException6.checkPositionIndexes(int start, int end, int size):
功能描述:搜检[start, end)是一个长度为size的list, string或array合法的局限子集。伴跟着错误信息。
失败时抛出的异常类型:IndexOutOfBoundsExceptionGuava的preconditions有如许几个长处:
在静态导入后, 办法很明白无歧义, checkNotNull可以清楚地告诉你它是干什么的, 它会抛出如何的异常.
checkNotNull在验证经由过程后直接返回, 可以如许便利地写代码: this.field = checkNotNull(field).
简单而又强大的可变参数printf风格的自定义错误信息.
彼此相爱,却不要让爱成了束缚:不如让它成为涌动的大海,两岸乃是你们的灵魂。互斟满杯,却不要同饮一杯。相赠面包,却不要共食一个。一起歌舞欢喜,却依然各自独立,相互交心,却不是让对方收藏。因为唯有生命之手,方能收容你们的心。站在一起却不要过于靠近。—— 纪伯伦《先知》