Precondition是一系列的静态方法,帮助方法或者构造函数方便的检查变量是否合法。对于我们的日常开发中,需要大量的检验输入是否合法,在处理数据前进行validate check非常必要,否则会造成大量的意料不到的异常。而通过这种函数,就可以将这个异常变为可控。
- checkArgument(boolean expression)
- 确保expression的真实性,false就抛出异常,一般配合isNotBlank使用
- IllegalArgumentException()
- checkState(boolean expression)
- 确保表达式的真实性,但不包含调用方法的任何参数。
- IllegalStateException()
- checkNotNull(T reference)
- 检查reference是否为空
- NullPointerException()
- checkElementIndex(int index, int size)
- 检查元素index是否在[0,size)的范围内,只需要传入大小
- IndexOutOfBoundsException()
- checkPositionIndex(int index, int size)
- 同上
- IndexOutOfBoundsException()
- checkPositionIndexes(int start, int end, int size)
- 检查[start,end)是否是长度为[0,size)的数组的子集,只需要传入大小
- IndexOutOfBoundsException()
源码分析
我们选择checkArgument()作为源码分析的样本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public static void checkArgument(boolean expression) { if (!expression) { throw new IllegalArgumentException(); } }
public static void checkArgument(boolean expression, @Nullable Object errorMessage) { if (!expression) { throw new IllegalArgumentException(String.valueOf(errorMessage)); } }
public static void checkArgument(boolean expression, @Nullable String errorMessageTemplate, @Nullable Object... errorMessageArgs) { if (!expression) { throw new IllegalArgumentException(format(errorMessageTemplate, errorMessageArgs)); } }
|
这个源码简单易懂
代码尝试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class Test { @org.junit.Test public static void main(String[] args) { Boolean test = StringUtils.isNotBlank(""); try{ Preconditions.checkArgument(test); } catch (Exception e){ System.out.println(e); }try{ Preconditions.checkArgument(test,"参数不可为空"); } catch (Exception e){ System.out.println(e); } try{ Preconditions.checkArgument(test,"该参数为%s",test); } catch (Exception e){ System.out.println(e); } } }
|
输出如下
1 2 3
| java.lang.IllegalArgumentException java.lang.IllegalArgumentException: 参数不可为空 java.lang.IllegalArgumentException: 该参数为false
|
Preconditions的优点就是很简单的在代码中正对判断抛出对应的异常,用%s的形式输出异常语句,简化了参数有效性校验的代码量。