在日常开发中,经常会遇到要对输入参数进行核验的情况,比如是否为空,参数的取值范围是否符合要求等等。单独进行校验的话,代码的重复率就很高了。这时我们可以用Preconditions类来统一校验参数,同时可以选择抛出对应的异常信息,让代码看起来更明了。

Preconditions类中提供了若干前置条件判断的静态方法,每个方法都有三种方式:

  • 没有额外参数:抛出的异常中没有错误消息;
  • 用一Object对象作为error message参数:使用Object.toString() 抛出异常错误消息;
  • 用字符串作为替换带有占位符的error message参数,类似于printf,但考虑GWT的兼容性和效率,只支持%s指示符。

例如

checkArgument(i >= 0, “Argument was %s but expected nonnegative”, i);
checkArgument(i < j, “Expected i < j, but %s > %s”, i, j);
方法:

checkNotNull、checkArgument和checkState有大量的重载,它们采用可变参数方式。

checkArgument(boolean)
检查boolean是否为true,用来检查传递给方法的参数。失败IllegalArgumentException

// Without an Error Message
public void test() {
int age = -7;
Preconditions.checkArgument(age > 0);
}

// With an Error Message
public void test() {
int age = -7;
String message = “Age can’t be zero or less than zero.”;
Preconditions.checkArgument(age > 0, message);
}

// With a Template Error Message
public void test() {
int age = -7;
String message = “Age should be positive number, you supplied %s.”;
Preconditions.checkArgument(age > 0, message, age);
}
checkNotNull(T)
检查value是否为null,该方法直接返回value,因此可以内嵌使用checkNotNull。失败NullPointerException

public void test() {
String nullObject = null;
String message = “Please check the Object supplied, its null!”;

Preconditions.checkNotNull(nullObject, message);
}

public void test() {
String nullObject = null;
String message = “Please check the Object supplied, its %s!”;

Preconditions.checkNotNull(nullObject, message,new Object[] { null });
}
checkState(boolean)
检查对象的一些状态,不依赖方法参数。例如,Iterator可以用来next是否在remove之前被调用。
用来检查对象的某些状态。失败IllegalStateException

public void test() {
int[] validStates = { -1, 0, 1 };
int givenState = 9;
String message = “You have entered an invalid state”;

Preconditions.checkState(Arrays.binarySearch(validStates, givenState) > 0, message);
}
以下方法无需直接传入list, string或array, 只需传入大小。

checkElementIndex(int index, int size)
检查index作为索引值对某个列表、字符串或数组是否有效。index>=0 && index< size,返回index。
失败IndexOutOfBoundsException,数组越界的时候需要这个

public void test() {
int[] numbers = { 1, 2, 3, 4, 5 };
String message = “Please check the bound of an array and retry”;

Preconditions.checkElementIndex(6, numbers.length - 1, message);
}
checkPositionIndex(int index, int size)
检查index作为位置值对某个列表、字符串或数组是否有效。index>=0 && index<=size。返回index。
失败 IndexOutOfBoundsException

public void test() {
int[] numbers = { 1, 2, 3, 4, 5 };
String message = “Please check the bound of an array and retry”;

Preconditions.checkPositionIndex(6, numbers.length - 1, message);
}
checkPositionIndexes(int start, int end, int size)、
检查[start, end]表示的位置范围对某个列表、字符串或数组是否有效,失败IndexOutOfBoundsException

public void test() {
int start = 1;
int end = 6;
int[] numbers = { 1, 2, 3, 4, 5 };

Preconditions.checkPositionIndexes(start, end, numbers.length);
}
总结一下

Preconditions类的方法非常简单明了。比如checkNotNull清楚地描述做了什么,会抛出什么异常;并且直接返回检查的参数,让你可以在构造函数中保持字段的单行赋值风格:this.field = checkNotNull(field)。

索引值常用来查找列表、字符串或数组中的元素,如List.get(int), String.charAt(int)

位置值和位置范围常用来截取列表、字符串或数组,如List.subList(int,int), String.substring(int)

简单、可自定义参数的异常信息。

Android开发中Preconditions前置条件判断相关推荐

  1. android 判断安装微信,Android开发中判断手机是否安装了QQ或者微信

    下面一段代码给大家分享了android中判断手机是否安装了qq或者微信,代码简单易懂,非常不错,具有参考借鉴价值,需要的的朋友参考下吧 public static boolean isWeixinAv ...

  2. Android开发中常见的设计模式

    对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是非常有必要的.对于想系统的学习设计模式的 ...

  3. android listview下拉动画效果,Android开发中利用ListView实现一个渐变式的下拉刷新动画...

    Android开发中利用ListView实现一个渐变式的下拉刷新动画 发布时间:2020-11-23 16:50:31 来源:亿速云 阅读:80 作者:Leah 本篇文章给大家分享的是有关Androi ...

  4. android viewpager fragment传值,Android开发中如何解决Fragment +Viewpager滑动页面重复加载的问题...

    前言 之前在做一个Viewpager上面加载多个Fragment时总会实例化已经创建好的Fragmnet对象类似 viewPager.setAdapter(new FragmentPagerAdapt ...

  5. android开发分页查询,Android开发中实现分页效果的简单步骤

    分页加载在程序开发中是必备的,但是我们实现这个功能并不仅仅为了美观,用户体验也是很重要的,爱站技术频道下面就带大家了解Android开发中实现分页效果的简单步骤,感兴趣的小伙伴们参考看看吧! 具体内容 ...

  6. android动态添加圆,Android开发中TextView 实现右上角跟随文本动态追加圆形红点

    在一个比较坑的需求里,一段文字右上角需要追加一个圆形红点.最右侧有个金额,红点动态随着文字移动,然后各种摆布局,一下午坑死我了.后来果断放弃.然后就想试试直接自定义view来实现这个需求. 最坑的就是 ...

  7. android 最新 九宫格,Android开发中怎么显示一个九宫格图片

    Android开发中怎么显示一个九宫格图片 发布时间:2020-11-21 15:09:33 来源:亿速云 阅读:86 作者:Leah 本篇文章给大家分享的是有关Android开发中怎么显示一个九宫格 ...

  8. Android开发中虚拟位置定位、应用双开、IP代理检测

    Android开发中虚拟位置定位.应用双开.IP代理检测 1.虚拟位置定位.应用双开原理 目前市面上的多开App的原理类似,都是以新进程运行被多开的App,并hook各类系统函数,使被多开的App认为 ...

  9. Android开发中VSS、RSS、PSS、USS的区别

    Android开发中VSS.RSS.PSS.USS的区别 1. VSS: Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) VSS表示一个进程可访问的全部内存地址空间的大小.这个 ...

最新文章

  1. 浏览器解析JavaScript原理
  2. SAP HANA CLOUD和aws一个实际项目中的性能比较
  3. 二、数据预处理——缺失值处理
  4. c语言中二分法100中找30,c语言中的二分法
  5. 【后台任务】将工作请求发送到后台服务(11)
  6. C++ STL容器vector篇(二) vector容器的构造函数与赋值操作
  7. 【操作系统】—处理机调度的概念以及层次
  8. 简单的光线追踪教程(一)
  9. Windows下QT5.9构建的debug或release文件打包后不能使用
  10. vue 项目 创建表格
  11. Android studio更换主题、背景图片
  12. Ajax——AJAX实现省市联动
  13. glove.840B.300d glove词向量词嵌入文件国内服务器下载 出现麻烦阻塞的点时,就要思考google有没有更快捷的方法
  14. python实现情人节的爱意表达
  15. 第11届极客大挑战writeup
  16. 春节祝福短信怎么发?付详细文案
  17. 多智能体强化学习-DGN
  18. 七牛前端使用JS-SDK上传文件完成时返回code:400报错
  19. navigation 的代价地图
  20. 我该如何锁住你?--云端数据加密方法深入对比

热门文章

  1. 厦门大学计算机网络实验四
  2. Web3 网络效应:五种心智模型
  3. thinkphp引入阿里云视频点播
  4. JVM_06 内存模型(JMM)篇
  5. 案例分析——2020春HIT网络与社会导论
  6. 计算机flash操作,会考计算机word、Excel、Photoshop、Flash的操作方法(之二)
  7. 梦最开始的地方,《一周学会Linux实战》韩顺平---视频笔记。到shell之前
  8. 5G网下通过网络编码增强转发策略的NDN物联网内容分发模型
  9. 如何在Dynamic CRM 2011中使用自定义Workflow
  10. 现在的网站无法访问了,如何访问过去的网站