【guava】前提条件
guava为编写漂亮代码提供了很大的便利,今天,我想向你展示下我是怎么使用预判断来避免不必要的if/throw 申明,使用选择来提升代码逻辑性。
预判断并不是新东西,Apache Commons项目有类似的功能,但是并没有瓜娃提供的解决方案简洁,预判断用来验证方法的参数,状态等等,当条件判断结果是false,预判断就会抛出预想的异常,预想的意味着以下情形,当检查状态的时候,你可以使用Preconditions.checkState( 条件 ),如果条件判断的结果是false,将会抛出非法状态异常,同样,另外一种预判断checkArgument会抛出非法参数异常,当然,使用预判断你唯一需要明确的时候就是使用静态导入,让我们来看一个例子。
给出的是一个方法,接受list作为参数,当这个方法被调用的时候,我们需要检查list是不是null和是不是空,一般的java解决方案如下所示:
public void doSomething( List<Object> list ) {
if( list == null ) {
throw new IllegalArgumentException( "List must not be null" );
}
if( list.isEmpty() ) {
throw new IllegalArgumentException( "List must not be empty" );
}
doSomethingMore( list );
}
当使用guava的预判断,代码的数量明显减少,解决方案如下所示.
public void doSomething( List<Object> list ) {
checkArgument( list != null, "List must not be null" );
checkArgument( !list.isEmpty(), "List must not be empty" );
doSomethingMore( list );
}
这肯定是一个提升,但是,当这个方法结合瓜娃的选择变得真正的性感,选择是一个概念,被设计来避免病态的null概念(阅读这里理解我为神马叫她“病态”),这里明显有一个对象容器来避免空引用,例如,null 大部分时间用来检查一个对象是不是存在,如果不存在,一个空指针异常发生了,结果如以下代码所示:
public void doSomething() {
if( this.field == null ) {
throw new IllegalStateException( "Field is not initialized" );
}
doSomethingMore();
}
与其保存这个对象直接放到field,我经常使用选择.这避免了我代码中的空指针异常并且显得更合语法,上面这个例子结合选择变成了如下所示:
public void doSomething() {
checkState( field.isPresent(), "Argument is not initialied" );
doSomethingMore();
}
最后,由你决定这个代码是不是更好更简洁,通过使用预判断和选择.从我的观点来看,这么写更具有可读性
【guava】前提条件的更多相关文章
- Dataguard配置前提条件
Data Guard配置前提条件 配置Data Guard必须保证以下前提条件: 1.Data Guard是Oracle企业版的组件.Oracle标准版里没有这个控件.所以Data Guard配置所使 ...
- java foreach遍历的前提条件
自我总结,欢迎拍砖,不胜感激! 目的: 加深foreach遍历的影响 证明:foreach遍历的前提条件是:list !=null ,而不是:list !=null && list.s ...
- centos7源码安装Python3的前提条件
centos7源码安装Python3的前提条件: # yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel readline- ...
- 程序基石系列之C++多态的前提条件
准备知识 C++中多态(polymorphism)有下面三个前提条件: 必须存在一个继承体系结构. 继承体系结构中的一些类必须具有同名的virtual成员函数(virtualkeyword) 至少有一 ...
- 安装爬虫 scrapy 框架前提条件
安装爬虫 scrapy 框架前提条件 (不然 会 报错) pip install pypiwin32
- C++学习22 多态的概念及前提条件
在<C++基类和派生类的赋值>一节中讲到,基类的指针也可以指向派生类对象.请看下面的例子: #include <iostream> using namespace std; c ...
- 命令行部署SharePoint2016离线前提条件和添加服务器的Feature
前言 Sp2016的软件环境要求如下: 服务器场中的数据库服务器的最低要求: 以下各项之一: Microsoft SQL Server 2014 Service Pack 1 (SP1) 的 64 位 ...
- 4.1 C++多态的概念及前提条件
参考:http://www.weixueyuan.net/view/6370.html 总结: 而多态的功能则是将函数名动态绑定到函数入口地址,这样的动态绑定过程称为运行期绑定. 而在运行期绑定的函数 ...
- go get安装第三方包的前提条件和步骤
首先,你要找到第三方类包所在的网址, 例如: http://github.com/go-sql-driver/mysql分为命令行自动安装 和 手动下载 然后安装. ( 欢迎加入go语言群: 218 ...
随机推荐
- php 中php-fpm 的重启、终止操作命令
php 中php-fpm 的重启.终止操作命令: service nginx restart service php-fpm restart 查看php-fpm进程数:ps aux | grep -c ...
- 解决maven构建工程错误:Failure to transfer org.apache.maven.plugins:maven-jar-plugin:pom:2.4 from错误
问题描述: mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=myapp -DarchetypeArtifactId=ma ...
- SMO是英文SQL Server Management Objects的缩写(上一篇文章的补充)
最近在项目中用到了有关SQL Server管理任务方面的编程实现,有了一些自己的心得体会,想在此跟大家分享一下,在工作中用到了SMO/SQL CLR/SSIS等方面的知识,在国内这方面的文章并不多见, ...
- html5调用本机摄像头兼容谷歌浏览器高版本,谷歌浏览器低版本,火狐浏览器
做这个功能的时候在网上查了一些资料,代码如下,在这个代码在谷歌浏览器46版本是没问题的,在火狐浏览器也行,但是在谷歌浏览器高版本下是不兼容的 <div id="body"&g ...
- zabbix监控MySQL部署实战
1.部署zabbix监控. 1.1 建用户组和用户 groupadd zabbix useradd -d /home/zabbix -g zabbix -m zabbix passwd zabbix ...
- mysql 批量插入与单条插入 的效率比较
1.数据插入性能(单个插入和批量插入) public class Test { private Long id; private String test; public Long getId() { ...
- sklearn 中 make_blobs模块
# 生成用于聚类的各向同性高斯blobsklearn.datasets.make_blobs(n_samples = 100,n_features = 2,center = 3,cluster_std ...
- oracle用户和权限
在oracle中,一个服务器上一般只有一个数据库.在一个数据库中,不同的用户项目由不同的用户访问,每一个用户拥有自身创建的数据库对象,当一个用户想访问其它用户下的数据库对象时,必须由对方授予一定的权限 ...
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 1_Introduction and Basic Concepts 介绍和基本概念
目录 1.1 欢迎1.2 机器学习是什么 1.2.1 机器学习定义 1.2.2 机器学习算法 - Supervised learning 监督学习 - Unsupervised learning 无 ...
- django 定时脚本
python 第三方定时执行 from datetime import datetime import time import os from apscheduler.schedulers.backg ...