在编写程序的时候,很多时候都需要检查输入的参数是否符合我们的需要,比如人的年龄需要大于0,名字不能为空;如果不符合这两个要求,我们将认为这个对象是不合法的,这时候我们需要编写判断这些参数是否合法的函数,我们可能这样写:

package com.wyp;

import java.util.ArrayList;
import java.util.List; /**
* Created with IntelliJ IDEA.
* User: 过往记忆
* Blog:http://www.iteblog.com
* Date: 13-7-24
* Time: 下午9:02
*/
public class TestObject {
List personList = new ArrayList(); public void addPerson(Person person) {
if (check(person)) {
personList.add(person); }
} private boolean check(Person person) {
if (person.getAge() > 0 && person.getName() != null) {
return true;
}
return false;
}
}

  这样看起来很不错,但是如果还有很多对象需要进行验证呢?这样你可能会想,我再去写几个函数去验证。但是你可能发现,这样的函数很难维护,而且可用性不高,扩展性也比较差,复用性就更谈不上了。
  这就是今天要谈的Guava中提供的Preconditions类,Preconditions提供了大量的用于参数的检测函数,在项目中使用了这个类,不仅可以简化我们的代码,而且可读性大大提高,何乐而不为呢?强烈建议在您的代码中使用这个类,而且在Preconditions类中的所有函数都是static修饰的,这意味着你不需要声明(你不可以申请一个Preconditions对象,因为Preconditions的构造函数用private修饰的)一个Preconditions类对象,而可以直接使用这个类提供的方法。在Preconditions中提供的校验类主要有以下几个:
  1、static void checkArgument(boolean expression):这个函数在expression为true的时候将不会发生任何事情,如果expression为false将会抛出IllegalArgumentException异常,说明输入的参数非法;Guava中的实现如下:

public static void checkArgument(boolean expression) {
if (!expression) {
throw new IllegalArgumentException();
}
}

  2、static void checkArgument(boolean expression, Object errorMessage):这个函数和上面的类似,只不过在抛出异常的同时多数出了errorMessage提示信息;Guava中的实现如下:

public static void checkArgument(
boolean expression, @Nullable Object errorMessage) {
if (!expression) {
throw new IllegalArgumentException(String.valueOf(errorMessage));
}
}

  3、static void checkArgument(boolean expression, String errorMessageTemplate, Object… errorMessageArgs):和上面的类似,只不过输出的提示信息可以被格式化成一定的格式;Guava中的实现如下:

 public static void checkArgument(boolean expression,
@Nullable String errorMessageTemplate,
@Nullable Object... errorMessageArgs) {
if (!expression) {
throw new IllegalArgumentException(
format(errorMessageTemplate, errorMessageArgs));
}
}

  4、static int checkElementIndex(int index, int size)检查index是否为在一个长度为size的list、string或array合法的范围。 index的范围区间是[0, size)(包含0不包含size)。无需直接传入list、string或array, 只需传入大小。返回index。失败时抛出的异常类型:IndexOutOfBoundsException;Guava中的实现如下:

public static int checkElementIndex(int index, int size) {
return checkElementIndex(index, size, "index");
}

  5、static int checkElementIndex(int index, int size, String desc)和上面的类似,只不过在出现异常的时候多数出一些提示信息(desc);Guava中的实现如下:

public static int checkElementIndex(
int index, int size, @Nullable String desc) {
// Carefully optimized for execution by hotspot (explanatory comment above)
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException(badElementIndex(index, size, desc));
}
return index;
}

  6、static T checkNotNull(T reference)检查reference不为null时,则直接返回value;否则抛出的异常类NullPointerException;Guava中的实现如下:

public static  T checkNotNull(T reference) {
if (reference == null) {
throw new NullPointerException();
}
return reference;
}

  7、static T checkNotNull(T reference, Object errorMessage)和上面的功能一样,只不过在抛出异常的时候输出了一些提示信息;Guava中的实现如下:

public static  T checkNotNull(T reference, @Nullable Object errorMessage) {
if (reference == null) {
throw new NullPointerException(String.valueOf(errorMessage));
}
return reference;
}

  8、static T checkNotNull(T reference, String errorMessageTemplate, Object… errorMessageArgs)和上面的类是,但是在出现异常的时候输出了格式化的错误信息提示;Guava中的实现如下:

public static  T checkNotNull(T reference,
@Nullable String errorMessageTemplate,
@Nullable Object... errorMessageArgs) {
if (reference == null) {
// If either of these parameters is null, the right thing happens anyway
throw new NullPointerException(
format(errorMessageTemplate, errorMessageArgs));
}
return reference;
}

  9、static int checkPositionIndex(int index, int size)检查位置index是否为在一个长度为size的list、string或array合法的范围。 index的范围区间是[0, size)(包含0不包含size)。无需直接传入list、string或array, 只需传入大小。成功的时候返回index;失败时抛出的异常类型:IndexOutOfBoundsException;Guava中的实现如下:

public static int checkPositionIndex(int index, int size) {
return checkPositionIndex(index, size, "index");
}

  10、static int checkPositionIndex(int index, int size, String desc)和上面的功能一样,在失败的时候返回提示信息(desc);Guava中的实现如下:

public static int checkPositionIndex(
int index, int size, @Nullable String desc) {
// Carefully optimized for execution by hotspot (explanatory comment above)
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException(badPositionIndex(index, size, desc));
}
return index;
}

  11、static void checkPositionIndexes(int start, int end, int size)检查[start, end)是一个长度为size的list、string或array合法的范围子集。失败时抛出的异常类型:IndexOutOfBoundsException;Guava中的实现如下:

public static void checkPositionIndexes(int start, int end, int size) {
// Carefully optimized for execution by hotspot (explanatory comment above)
if (start < 0 || end < start || end > size) {
throw new IndexOutOfBoundsException(badPositionIndexes(start, end, size));
}
}

  12、static void checkState(boolean expression)这个判断expression是否为true,如果是则什么都不做,否则抛出IllegalStateException异常;Guava中的实现如下:

public static void checkState(boolean expression) {
if (!expression) {
throw new IllegalStateException();
}
}

  13、static void checkState(boolean expression, Object errorMessage)和上面的功能一样,只不过在抛出异常的时候输出了一些提示信息;Guava中的实现如下:

public static void checkState(
boolean expression, @Nullable Object errorMessage) {
if (!expression) {
throw new IllegalStateException(String.valueOf(errorMessage));
}
}

  14、static void checkState(boolean expression, String errorMessageTemplate, Object… errorMessageArgs)和上面的类是,但是在出现异常的时候输出了格式化的错误信息提示;Guava中的实现如下:

public static void checkState(boolean expression,
@Nullable String errorMessageTemplate,
@Nullable Object... errorMessageArgs) {
if (!expression) {
throw new IllegalStateException(
format(errorMessageTemplate, errorMessageArgs));
}
}

  说了这么多,如何来用这个类呢?如下所示:

import com.google.common.base.Preconditions;

public void TestPre(Person person, List plist, int index) {
Preconditions.checkArgument(person != null);
Preconditions.checkNotNull(plist);
Preconditions.checkState(index > 0);
Preconditions.checkPositionIndex(index, plist.size());
Preconditions.checkElementIndex(index, plist.size());
}

  这样就可以测试一个函数输入的参数是否合法。在Guava中的Strings类中还有Strings.isNullOrEmpty(“”)和Strings.emptyToNull(“”);两个用于检测字符串参数是否合法的函数,使用起来和Preconditions差不多,很简单,具体的就不介绍了。
  Guava中的Preconditions有以下几个优点:(1)、在静态导入后, 方法很明确无歧义, checkNotNull可以清楚地告诉你它是干什么的, 它会抛出怎样的异常。(2、)简单而又强大的可变参数’printf’风格的自定义错误信息。也去你代码中加入Preconditions类吧!
(完)

Guava学习之Preconditions的更多相关文章

  1. Guava学习笔记目录

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...

  2. guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁

    guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁 1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code- ...

  3. Guava学习

    Guava学习笔记目录 Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concu ...

  4. [置顶] Guava学习之Lists

    Lists类主要提供了对List类的子类构造以及操作的静态方法.在Lists类中支持构造ArrayList.LinkedList以及newCopyOnWriteArrayList对象的方法.其中提供了 ...

  5. guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...

  6. [置顶] Guava学习之ArrayListMultimap

    ArrayListMultimap类的继承关系如下图所示: Guava ArrayListMultimap List Multimap 是一个接口,继承自 Multimap 接口.ListMultim ...

  7. [置顶] Guava学习之Splitter

    Splitter:在Guava官方的解释为:Extracts non-overlapping substrings from an input string, typically by recogni ...

  8. [置顶] Guava学习之Iterators

    Iterators类提供了返回Iterator类型的对象或者对Iterator类型对象操作的方法.除了特别的说明,Iterators类中所有的方法都在Iterables类中有相应的基于Iterable ...

  9. [置顶] Guava学习之Immutable集合

    Immutable中文意思就是不可变.那为什么需要构建一个不可变的对象?原因有以下几点: 在并发程序中,使用Immutable既保证线程安全性,也大大增强了并发时的效率(跟并发锁方式相比).尤其当一个 ...

随机推荐

  1. CSS之BFC、IFC、FFC and GFC

    CSS之BFC.IFC.FFC and GFC 什么是FC? BFC(Block Formatting Contexts) BFC的布局规则: 如何生成BFC: IFC(Inline Formatti ...

  2. SqlServer收缩日志文件

    通过收缩的方法可以释放所占空间. 第一步:将数据库的模式调整为简单模式 右击数据库名->'属性'->'选项'->恢复模式改成'简单'->点'确定'按钮. 第二步:收缩文件 右键 ...

  3. 不知道如何处理的Windows Phone异常

    后台收到这么一段异常信息,从下文中看是SQL Server Compact database出错了,但怎么出错的,为什么会出错,如何避免? 没有一点办法,如果您fix过这种问题,恳请指点迷津,谢谢! ...

  4. 【BZOJ】【1007】【HNOI2008】水平可见直线

    计算几何初步 其实是维护一个类似下凸壳的东西?画图后发现其实斜率是单调递增的,交点的横坐标也是单调递增的,所以排序一下搞个单调栈来做就可以了…… 看了hzwer的做法…… /************* ...

  5. 新买的mac笔记本,发现vi编辑器没有颜色的解决方案

    新买的mac笔记本,发现vi编辑器没有颜色的解决方案 我在网络上找了一些资料,发现都有些问题,尤其是一些让修改根目录上的文件,发现根本无法修改. 但是在网络上找到了这篇文章: http://super ...

  6. go语言之进阶篇成员操作

    1.成员操作 示例: package main import "fmt" type Person struct { name string //名字 sex byte //性别, ...

  7. LoadTestAgentResultsLateException in VS2010

    遇到报错, 首先得先仔细读读人家给的出错信息. 而不是先怀疑是自己什么地方弄错了, 胡乱修改. 比如说, 遇到下面的报错: LoadTestAgentResultsLateException    R ...

  8. Best Time to Buy and Sell Stock III leetcode java

    题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...

  9. Java 线程内异常处理

    Thread的run方法是不抛出任何检查型异常(checked exception)的,但是它自身却可能因为一个异常而被终止,导致这个线程的终结.最麻烦的是,在线程中抛出的异常即使使用try...ca ...

  10. 两个JS对象怎样才能相等

    在JS中,两个对象如何才能相等?下面的两个 Alert,只有一个输出true.  在JS中如何才能构造出两个JS对象相等? var prop1 = {asd:{def:'abc'}}; var pro ...