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为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


      Guava的preconditions有如许几个长处:


      在静态导入后, 办法很明白无歧义, checkNotNull可以清楚地告诉你它是干什么的, 它会抛出如何的异常.
      checkNotNull在验证经由过程后直接返回, 可以如许便利地写代码: this.field = checkNotNull(field).
          简单而又强大的可变参数printf风格的自定义错误信息.


    彼此相爱,却不要让爱成了束缚:不如让它成为涌动的大海,两岸乃是你们的灵魂。互斟满杯,却不要同饮一杯。相赠面包,却不要共食一个。一起歌舞欢喜,却依然各自独立,相互交心,却不是让对方收藏。因为唯有生命之手,方能收容你们的心。站在一起却不要过于靠近。—— 纪伯伦《先知》
    分享到: