番石榴前提条件课

编写过很多Java文章的人可能都编写了以条件为开头的方法,这些条件可以在继续进行该方法的其余实现之前,先验证提供的参数或要操作的对象的状态。 这些会增加方法的冗长性,有时,尤其是在有多个检查的情况下,几乎会淹没该方法有趣的业务逻辑。 减少这种混乱的一种方法是使用Java断言 ,但是默认情况下会在运行时禁用它们。 实际上,出于这个原因, 建议 “不要在公共方法中使用断言进行参数检查”,而应使用适当的运行时异常 。 Guava提供了一个方便的Preconditions类,该类具有断言的美学优势,但它使用常规的Java异常机制,并且在运行时未禁用。 这篇文章提供了一些实际使用Guava的Preconditions类的示例。

下一个代码清单显示了使用Guava的Preconditions类制作的示例。 该示例演示了在Preconditions类上使用静态方法检查参数是否为null,检查参数在提供的数组中的位置,检查以确保为参数提供了有效值以及检查对象的状态是否为true。调用哪种方法适合该方法的执行。 还要注意,我对Preconditions类使用了静态导入 ,这样我就可以调用其静态方法,而不必将每次调用的范围都限定为类名。

GuavaPreconditionsDemo.java

package dustin.examples;import static java.lang.System.err;
import static com.google.common.base.Preconditions.*;/*** Simple demonstration of Guava's Preconditions support.* * @author Dustin*/
public class GuavaPreconditionsDemo
{private final boolean initialized = false;/*** Demonstrate Guava's Preconditions.checkNotNull methods.* * @param parameter Parameter that is checked for null-ness.*/public void testForNonNullArgument(final String parameter){final String localParameter = checkNotNull(parameter, 'Provided parameter is unacceptably null.');}public void testDivisorNotZero(final int divisor){checkArgument(divisor != 0, 'Zero divisor not allowed.');}public void testArrayElement(final String[] strArray, final int indexNumber){final int index = checkElementIndex(indexNumber, strArray.length, 'String array index number');}public void testArrayPosition(final String[] strArray, final int indexNumber){final int index = checkPositionIndex(indexNumber, strArray.length, 'String array index number');}public void testState(){checkState(this.initialized, 'Cannot perform action because not initialized.');}public static void printHeader(final String newHeaderText){err.println('\n==========================================================');err.println('== ' + newHeaderText);err.println('==========================================================');      }/*** Main function for executing demonstrations of Guava's Preconditions.*/public static void main(final String[] arguments){final GuavaPreconditionsDemo me = new GuavaPreconditionsDemo();printHeader('Preconditions.checkNotNull');try{me.testForNonNullArgument(null);}catch (NullPointerException npe){npe.printStackTrace();}printHeader('Preconditions.checkArgument');try{me.testDivisorNotZero(0);}catch (IllegalArgumentException illArgEx){illArgEx.printStackTrace();}printHeader('Preconditions.checkElementIndex');try{me.testArrayElement(new String[]{'Dustin', 'Java'}, 3);}catch (IndexOutOfBoundsException ioobEx){ioobEx.printStackTrace();}printHeader('Preconditions.checkPositionIndex');try{me.testArrayPosition(new String[]{'Dustin', 'Java'}, 3);}catch (IndexOutOfBoundsException ioobEx){ioobEx.printStackTrace();}printHeader('Preconditions.checkState');try{me.testState();}catch (IllegalStateException illStateEx){illStateEx.printStackTrace();}}
}

上面的代码清单中演示的每种情况都检查了方法参数或调用方法所针对的对象状态的前提条件,而无需使用“嘈杂”的条件语句。 静态导入的使用允许非常简洁地表达要检查的条件,该类的大部分是“主要”功能,在这种情况下用作“测试驱动程序”。 我将调用放在try-catch块中,以确保执行了所有演示。 接下来显示运行以上命令的输出。

执行以上类的输出

==========================================================
== Preconditions.checkNotNull
==========================================================
java.lang.NullPointerException: Provided parameter is unacceptably null.at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:204)at dustin.examples.GuavaPreconditionsDemo.testForNonNullArgument(GuavaPreconditionsDemo.java:22)at dustin.examples.GuavaPreconditionsDemo.main(GuavaPreconditionsDemo.java:62)==========================================================
== Preconditions.checkArgument
==========================================================
java.lang.IllegalArgumentException: Zero divisor not allowed.at com.google.common.base.Preconditions.checkArgument(Preconditions.java:88)at dustin.examples.GuavaPreconditionsDemo.testDivisorNotZero(GuavaPreconditionsDemo.java:27)at dustin.examples.GuavaPreconditionsDemo.main(GuavaPreconditionsDemo.java:72)==========================================================
== Preconditions.checkElementIndex
==========================================================
java.lang.IndexOutOfBoundsException: String array index number (3) must be less than size (2)at com.google.common.base.Preconditions.checkElementIndex(Preconditions.java:301)at dustin.examples.GuavaPreconditionsDemo.testArrayElement(GuavaPreconditionsDemo.java:32)at dustin.examples.GuavaPreconditionsDemo.main(GuavaPreconditionsDemo.java:82)==========================================================
== Preconditions.checkPositionIndex
==========================================================
java.lang.IndexOutOfBoundsException: String array index number (3) must not be greater than size (2)at com.google.common.base.Preconditions.checkPositionIndex(Preconditions.java:351)at dustin.examples.GuavaPreconditionsDemo.testArrayPosition(GuavaPreconditionsDemo.java:37)at dustin.examples.GuavaPreconditionsDemo.main(GuavaPreconditionsDemo.java:92)==========================================================
== Preconditions.checkState
==========================================================
java.lang.IllegalStateException: Cannot perform action because not initialized.at com.google.common.base.Preconditions.checkState(Preconditions.java:145)at dustin.examples.GuavaPreconditionsDemo.testState(GuavaPreconditionsDemo.java:42)at dustin.examples.GuavaPreconditionsDemo.main(GuavaPreconditionsDemo.java:102)

当违反指定条件时,不同的静态Preconditions方法会引发不同类型的运行时异常。 他们会抛出异常,这些异常往往适合于被违反的特定案例。 这意味着在大多数情况下, Preconditions静态方法调用的结果与可能针对该条件显式抛出的结果相同,但是使用更少的代码进行检查并引发异常。 我没有在本文中显示它,但是这些静态方法的重载版本还允许提供字符串参数以填充带图案的String中的占位符。 这有助于将与错误条件关联的值放在异常消息中。

结论

番石榴简化了编码,并提高了合同检查方法的流畅性和可读性。 它提供了断言的简洁语法的优点,以及传统的抛出运行时异常的优点。

参考:来自JCG合作伙伴 Dustin Marx的Guava前提条件课程,来自Inspired by Actual Events博客。

翻译自: https://www.javacodegeeks.com/2012/11/guava-preconditions-class.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dw空心圆项目符号_如何懂建筑施工图?搞懂这些符号解析,耐下性子研究不会学不会...

施工图纸一个建筑方向,是房屋建筑的依据,更是一种工程语言,它能够明确的规定出我们建造出怎样的建筑,看懂它是入行基础。当然建筑图包含的因素比较多,有具体的建筑符号,尺寸、做法以及技术要求都在里面&…

子域名查询技术

子域名查询是渗透测试中的重要一环,收集尽可能多的子域名就是尽可能地扩大我们的攻击面和了解网络内部结构。 子域名保存位置利用点具体用法DNS服务器区域传送漏洞dig ns.dnsdomain.com target.com axfr主站链接网站爬虫百度site:target.com被动解析字典枚举解析fie…

Dashboard集群

#Dashboard集群 openstack pike 部署 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##8.Dashboard集群#####在controller1安装配置#安装 yum install openstack-dashboard -y#配置 cp /etc/openstack-dashboard/local_settings{,.bak} #egrep -v #|^$ /etc/openstack-…

canvas学习和滤镜实现

最近学习了 HTML5 中的重头戏--canvas。利用 canvas,前端人员可以很轻松地、进行图像处理。其 API 繁多,这次主要学习常用的 API,并且完成以下两个代码:实现去色滤镜实现负色(反色)滤镜 欢迎入群:857989948 。IT 技术深…

python 数据分析库_五个 Python 常用数据分析库

前言 Python 是常用是数据分析工具,常用的数据分析库有很多,下面主要介绍如下五个分析库:NumPy、Pandas、SciPy、StatsModels、Matplotlib。 NumPy 是一个非常常用的数据分析库,更准确点说是一个数学计算库,包括下面的…

android代码混淆作用,Android分享:代码混淆那些事

1) 前言ProGuard是一个开源的Java代码混淆器。它可以混淆Android项目里面的java代码,对的,你没看错,仅仅是java代码。它是无法混淆Native代码,资源文件drawable、xml等。2) ProGuard作用压缩: 移除无效的类、属性、方法等优化: 优…

echarts图形,图形自适应窗口大小

一个页面只有一个echarts图形时,可以写为myChart.setOption(option);window.onresize myChart.resize;一个页面含有多个echarts图形时,则只有一个图形可自适应窗口大小,另外一个则不能随窗口大小而改变图形大小,解决办法为在每一…

施工部署主要不包括_建筑工程施工方案及培训实例

[南京]大型土石方工程施工方案本资料为[南京]大型土石方工程施工方案格,共43页。内容简介:本工程位于南京化工园内,扬子玉带扬巴路附近,工程项目为江苏成品油管道配设施扬子玉带油库套油库工程,由中国石化股份有限公司…

Markdown 进阶

目录 markdown进阶语法 内容目录加强代码块脚注流程图时序图LaTeX公式 markdown进阶语法 内容目录 使用 [TOC] 引用目录,将 [TOC] 放至文本的首行,编辑器将自动生成目录有一些编辑器不支持[TOC]标记 加强代码块 使用3个 "" “语言名称”…

Python 字典 values() 方法

描述 Python 字典 values() 方法以列表形式(并非直接的列表,若要返回列表值还需调用list函数)返回字典中的所有值。 语法 values() 方法语法: D.values() 参数 无。返回值 以列表形式返回字典中的所有值。 实例 以下实例展示了 va…

适用于Atom Feed的Spring MVC

如何仅使用两个类就将提要(Atom)添加到Web应用程序? Spring MVC呢? 这是我的假设: 您正在使用Spring框架 您有一些要发布在供稿中的实体,例如“新闻” 您的“新闻”实体具有creationDate,tit…

python数据类型所占字节数_python标准数据类型 Bytes

预备知识: bin(): """ Return the binary representation of an integer. >>> bin(2796202) 0b1010101010101010101010 """ pass ord(): """ Return the Unicode code point for a one-character…

java第六次作业

《Java技术》第六次作业 (一)学习总结 1.用思维导图对本周的学习内容进行总结。 2.当程序中出现异常时,JVM会依据方法调用顺序依次查找有关的错误处理程序。可使用printStackTrace 和getMessage方法了解异常发生的情况。阅读下面的程序&#…

华为鸿蒙不再孤,华为鸿蒙OS系统不再孤单!又一款国产系统启动内测:再掀国产替代化...

【5月10日讯】相信大家都知道,备受广大花粉们期待的鸿蒙OS系统终于开始推送公测版本了,并且适配机型也开始不断地增多,而根据华为官方最新消息,华为鸿蒙OS系统将会在6月份开始大规模推送正式版鸿蒙系统,这无疑将会成为…

Spring系列合并

Spring Collection合并是我第一次遇到的功能,它是对StackOverflow 问题的回答 这是一种创建基本集合(列表,集合,地图或属性)并在其他Bean中修改此基本集合的方法,下面通过一个示例对此进行最好的解释- 考虑…

CSS 水平垂直居中

方法一&#xff1a; 容器确定宽高&#xff1a;知识点&#xff1a;transform只能设置在display为block的元素上。 <head> <meta charset"UTF-8"> <title>Title</title> <style type"text/css"> #container{…

linux怎么进入文件夹_Linux基础命令《上》

上一节介绍了VMware中安装centos7以及克隆系统&#xff0c;之中用到的几个命名还都是开发不常用的&#xff0c;这节课就准备讲解一下入门的Linux命名&#xff0c;都是日常使用的。首先呢&#xff0c;我们进入系统后&#xff0c;得先知道我是谁&#xff0c;我在哪儿&#xff1f;…

UML学习(一)-----用例图

1、什么是用例图 用例图源于Jacobson的OOSE方法&#xff0c;用例图是需求分析的产物&#xff0c;描述了系统的参与者与系统进行交互的功能&#xff0c;是参与者所能观察和使用到的系统功能的模型图。它的主要目的就是帮助开发团队以一种可视化的方式理解系统的功能需求&#xf…

首款鸿蒙系统终端n,荣耀智慧屏正式发布,首款搭载鸿蒙系统终端,家庭C位新选择...

原标题&#xff1a;荣耀智慧屏正式发布&#xff0c;首款搭载鸿蒙系统终端&#xff0c;家庭C位新选择智能手机的普及率越来越高&#xff0c;其所能够承担的功能也越来越多&#xff0c;电视机对于很多中青年的用户来讲&#xff0c;更多的时候就是个摆设。在家庭中&#xff0c;看电…

oracle如何保证数据一致性和避免脏读

oracle通过undo保证一致性读和不发生脏读 1.不发生脏读2.一致性读3. 事务槽&#xff08;ITL&#xff09;小解1.不发生脏读 例如&#xff1a;用户A对表更新了&#xff0c;没有提交&#xff0c;用户B对进行查询&#xff0c;没有提交的更新不能出现在用户的查询结果中 举例并通个d…