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

import org.junit.Test;public class PreconditionsTest {@Testpublic 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 {@Testpublic 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为null

  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

  一个比较实用实例:

import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import com.google.common.base.Preconditions;public class PreconditionsTest {@Testpublic 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());}List<Integer> intList=new ArrayList<Integer> ();for(int i=0;i<10;i++){            try {checkState(intList,9);intList.add(i);} catch (Exception e) {System.out.println(e.getMessage());}}try {checkPositionIndex(intList,3);    } catch (Exception e) {System.out.println(e.getMessage());}try {checkPositionIndex(intList,13);    } catch (Exception e) {System.out.println(e.getMessage());}try {checkPositionIndexes(intList,3,7);} 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 {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<Integer> intList,int index)throws Exception{//表达式为true不抛异常Preconditions.checkState(intList.size()<index, " intList size 不能大于"+index);}public static void checkPositionIndex(List<Integer> intList,int index) throws Exception{Preconditions.checkPositionIndex(index, intList.size(), "index "+index+" 不在 list中, List size为:"+intList.size());}public static void checkPositionIndexes(List<Integer> intList,int start,int end) throws Exception{Preconditions.checkPositionIndexes(start, end, intList.size());}public static void checkElementIndex(List<Integer> intList,int index) throws Exception{Preconditions.checkElementIndex(index, intList.size(),"index 为 "+index+" 不在 list中, List size为: "+intList.size());}
}

  输出结果:

a person age:8,neme:peida
age 必须大于0
neme为''
neme为nullintList size 不能大于9
index 13 不在 list中, List size为:9 (13) 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'风格的自定义错误信息.

Guava学习笔记(三):Preconditions优雅的检验参数相关推荐

  1. Guava学习笔记:Preconditions优雅的检验参数

    在日常开发中,我们经常会对方法的输入参数做一些数据格式上的验证,以便保证方法能够按照正常流程执行下去.对于可预知的一些数据上的错误,我们一定要做事前检测和判断,来避免程序流程出错,而不是完全通过错误处 ...

  2. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  3. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  4. Ethernet/IP 学习笔记三

    Ethernet/IP 学习笔记三 原文为硕士论文: 工业以太网Ethernet/IP扫描器的研发 知网网址: http://kns.cnki.net/KCMS/detail/detail.aspx? ...

  5. iView学习笔记(三):表格搜索,过滤及隐藏列操作

    iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...

  6. 吴恩达《机器学习》学习笔记三——多变量线性回归

    吴恩达<机器学习>学习笔记三--多变量线性回归 一. 多元线性回归问题介绍 1.一些定义 2.假设函数 二. 多元梯度下降法 1. 梯度下降法实用技巧:特征缩放 2. 梯度下降法的学习率 ...

  7. Python基础学习笔记三

    Python基础学习笔记三 print和import print可以用,分割变量来输出 import copy import copy as co from copy import deepcopy ...

  8. Mr.J-- jQuery学习笔记(三十二)--jQuery属性操作源码封装

    扫码看专栏 jQuery的优点 jquery是JavaScript库,能够极大地简化JavaScript编程,能够更方便的处理DOM操作和进行Ajax交互 1.轻量级 JQuery非常轻巧 2.强大的 ...

  9. MYSQL学习笔记三:日期和时间函数

    MYSQL学习笔记三:日期和时间函数 1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ ...

  10. Guava学习笔记:简化异常处理的Throwables类

    Guava学习笔记:简化异常处理的Throwables类 参考文章: (1)Guava学习笔记:简化异常处理的Throwables类 (2)https://www.cnblogs.com/peida/ ...

最新文章

  1. mysql mgr应用场景_悄悄告诉你 MySQL MGR 牛在哪?
  2. python 自带虚拟环境
  3. 用上GAN的推荐算法成精了,看完视频马上刷出相关文章丨KDD 2021
  4. MyBatis的foreach语句详解
  5. java jndi 例子_MEJB附录B,jndi例子无法运行的问题
  6. 数据科学竞赛-房价预测
  7. 第二课 运算符(day10)
  8. 机器学习笔记(4):多变量线性回归
  9. Mybatis mapper代理SqlMapConfig.xml配置详解
  10. leetcode41. First Missing Positive
  11. opencv中的resize函数实现图像插值缩放
  12. 面试官:有了 for 循环,为什么还要 forEach ??
  13. sudo chown -R nobody:nogroup clear
  14. 主成分分析(PCA)原理详解
  15. 5.24 综合案例2.0-雷达避障系统(仅支持2.2以上版本)
  16. Android Studio模拟器的创建和SDK的安装
  17. 【机器人栅格地图】基于灰狼算法求解栅格地图路径规划及避障含Matlab源码
  18. 中国高分系列卫星介绍
  19. SAP ABAP Odata
  20. 解密联物电子科技冠军电感(恩智浦智能车竞赛之电磁信号采集)

热门文章

  1. mysql优化 my.cnf_MySQL性能调优my.cnf详解
  2. GitHub for Windows使用教程(一)
  3. 开发基于大数据平台的搜索引擎
  4. 11.正则返回不是组的内容
  5. ExtJS4.2学习(13)基于表格的扩展插件---rowEditing
  6. HDU ACM 2647 Reward (topology----拓扑排序)
  7. .net抽象类和抽象函数abstract
  8. 中国人寿诈骗的内幕 (转自杭州网论坛)
  9. uniapp 获取用户手机号
  10. MapStruct 入门使用