博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Guava API学习之Preconditions优雅的检验参数
阅读量:4151 次
发布时间:2019-05-25

本文共 5467 字,大约阅读时间需要 18 分钟。

 

      在日常开发中,我们经常会对方法的输入参数做一些数据格式上的验证,以便保证方法能够按照正常流程执行下去。对于可预知的一些数据上的错误,我们一定要做 事前检测和判断,来避免程序流程出错,而不是完全通过错误处理来保证流程正确执行,毕竟错误处理是比较消耗资源的方式。在平常情况下我们对参数的判断都需 要自己来逐个写方法判断,代码量不少并且复用性不高,如下所示:

public static void main(String[] args) {			getPerson(8,"peida");                getPerson(-9,"peida");                getPerson(8,"");                getPerson(8,null);		}			public static void getPerson(int age,String name){		if (age > 0 && null != name && name.isEmpty() != true) {			System.out.println("a person age:"+age+",name:"+name);		}else {			System.out.println("参数输入有误!");		}	}

 

结果:

 

a person age:8,name:peida参数输入有误!参数输入有误!参数输入有误!

 

 说明:参数验证,我们每次都要添加if语句来做判断, 重复的工作会做好多次。getPerson方法只有2个参数,验证规则也不是很复杂,如果参数过度,验证规则复杂后,上面代码的可读性都会很差的,复用性就更谈不上了。

  Guava类库中提供了一个作参数检查的工具类--Preconditions类, 该类可以大大地简化我们代码中对于参数的预判断和处理,让我们对方法输入参数的验证实现起来更加简单优雅,下面我们看看Preconditions类的使用实例: 

@Test	public void test(){		//getPersonByPrecondition(8,"peida");        		getPersonByPrecondition(-9,"peida");               // getPersonByPrecondition(8,"");        //getPersonByPrecondition(8,null);		}		public static void getPersonByPrecondition(int age,String name){		Preconditions.checkNotNull(name, "neme为null");        Preconditions.checkArgument(name.length()>0, "neme为\'\'");        Preconditions.checkArgument(age>0, "age 必须大于0");        System.out.println("a person age:"+age+",neme:"+name);}

  

Preconditions里面的方法:

1 .checkArgument(boolean) :

  功能描述:检查boolean是否为真。 用作方法中检查参数
  失败时抛出的异常类型: IllegalArgumentException

2.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。
  失败时抛出的异常类型:IndexOutOfBoundsException

6.checkPositionIndexes(int start, int end, int size):

  功能描述:检查[start, end)是一个长度为size的list, string或array合法的范围子集。伴随着错误信息。
  失败时抛出的异常类型:IndexOutOfBoundsException

 

下面一个比较实用实例:

@Test	public void test2() throws Exception{		getPersonByPrecondition(8, "sungang");		// result : a person age:8,neme:sungang				try {			getPersonByPrecondition(-9, "sunang");		} catch (Exception e) {			System.out.println(e.getMessage());			// result :age 必须大于0		}				try {			getPersonByPrecondition(8,"");		} catch (Exception e) {			System.out.println(e.getMessage());			// result : neme为''		}				try {			getPersonByPrecondition(8,null);		} catch (Exception e) {			System.out.println(e.getMessage());			//result : neme为null		}						List
intList = new ArrayList
(); for (int i = 0; i < 10;i++) { try { checkState(intList, 9); intList.add(i); } catch (Exception e) { System.out.println(e.getMessage()); break; //result : intList size 不能大于:9 } } try { checkPositionIndex(intList, 4); } catch (Exception e) { System.out.println(e.getMessage()); } try { checkPositionIndex(intList, 10); } catch (Exception e) { System.out.println(e.getMessage()); } try { checkPositionIndexes(intList, 3, 17); } catch (Exception e) { System.out.println(e.getMessage()); } try { checkPositionIndexes(intList, 13, 17); } catch (Exception e) { System.out.println(e.getMessage()); } try { checkPositionIndexes(intList, 3, 8); } catch (Exception e) { System.out.println(e.getMessage()); } try { checkElementIndex(intList, 6); } catch (Exception e) { System.out.println(e.getMessage()); } try { checkElementIndex(intList, 16); } 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); } public static void checkState(List
intList,int index) throws Exception{ //表达式为true不抛异常 Preconditions.checkState(intList.size() < index,"intList size 不能大于:"+index); } public static void checkPositionIndex(List
intList,int index) throws Exception{ Preconditions.checkPositionIndex(index, intList.size(),"index :" + index + " 不在 list中,list size为:" + intList.size()); } public static void checkPositionIndexes(List
intList,int start,int end) throws Exception{ Preconditions.checkPositionIndexes(start, end, intList.size()); } public static void checkElementIndex(List
intList,int index) throws Exception{ Preconditions.checkElementIndex(index, intList.size(),"index 为 "+index+" 不在 list中, List size为: "+intList.size()); }

 

 

结果:

a person age:8,neme:sungangage 必须大于0neme为''neme为nullintList size 不能大于:9index :10 不在 list中,list size为:9 (10) must not be greater than size (9)end index (17) must not be greater than size (9)start index (13) must not be greater than size (9)index 为  16 不在 list中, List size为: 9 (16) must be less than size (9)

 

 

 

Guava的preconditions有这样几个优点:

   在静态导入后, 方法很明确无歧义, checkNotNull可以清楚地告诉你它是干什么的, 它会抛出怎样的异常.

   checkNotNull在验证通过后直接返回, 可以这样方便地写代码: this.field = checkNotNull(field).
        简单而又强大的可变参数'printf'风格的自定义错误信息.

 

转载地址:http://jplti.baihongyu.com/

你可能感兴趣的文章
Android studio_迁移Eclipse项目到Android studio
查看>>
JavaScript setTimeout() clearTimeout() 方法
查看>>
CSS border 属性及用border画各种图形
查看>>
转载知乎-前端汇总资源
查看>>
JavaScript substr() 方法
查看>>
JavaScript slice() 方法
查看>>
JavaScript substring() 方法
查看>>
HTML 5 新的表单元素 datalist keygen output
查看>>
(转载)正确理解cookie和session机制原理
查看>>
jQuery ajax - ajax() 方法
查看>>
将有序数组转换为平衡二叉搜索树
查看>>
最长递增子序列
查看>>
从一列数中筛除尽可能少的数,使得从左往右看这些数是从小到大再从大到小...
查看>>
判断一个整数是否是回文数
查看>>
腾讯的一道面试题—不用除法求数字乘积
查看>>
素数算法
查看>>
java多线程环境单例模式实现详解
查看>>
将一个数插入到有序的数列中,插入后的数列仍然有序
查看>>
在有序的数列中查找某数,若该数在此数列中,则输出它所在的位置,否则输出no found
查看>>
万年历
查看>>