你应该更新的 Java 知识之常用程序库【转载】
在很多人眼中,Java 已经是一门垂垂老矣的语言,但并不妨碍 Java 世界依然在前进。如果你曾离开 Java,云游于其它世界,或是每日只在遗留代码中挣扎,或许是时候抬起头,看看老 Java 中的新东西。
Guava
Guava[gwɑ:və],一句话,只要你做Java项目,就应该用Guava(Github)。官方 API。
guava 是 Google 出品的一套 Java 核心库,在我看来,它甚至应该是 JDK 的一部分。作为一个 Java 程序员,如果你没抱怨过JDK的设计,只能说明一点,你写得程序还是太少。正是JDK设计不彰,才有了一些项目来补充JDK的不足。如果说老Java程序员应该听说过 Apache Commons Lang,那新Java程序员该知道的就是Guava了。
老 Java 程序员更多的是知道 Google Collections,不妨到它的主页上走一遭,你会看到这个库已经改名为 Guava。事实上,Guava 并不直接等于 Google Collections,Guava 是一个超集。Guava 实在太强大了,要想展现它的强大,需要专门的介绍,这里就不展开了。
下面以一个统计单词出现个数的小程序作为这个段落的结尾,虽然无法与许多其它语言的实现相提并论,但作为一个Java程序员,你不妨想一下按照传统方式,这段代码应该是什么样子。
String content = Files.toString(new File(args[0]), Charset.defaultCharset());
Iterable texts = Splitter.on(CharMatcher.WHITESPACE)
.omitEmptyStrings()
.trimResults()
.split(content);
Multiset collection = HashMultiset.create(texts);
此外,Guava 还提供:
- 缓存(caching),本地缓存实现,支持多种缓存过期策略);
- 原生类型(primitives) ,扩展 JDK 未提供的原生类型(如int、char)操作, 包括某些类型的无符号形式;
- 并发库(concurrency libraries),强大而简单的抽象,使编写正确的并发代码更简单;
- 通用注解(common annotations)、
- 字符串处理(string processing),字符串工具,包括分割、连接、填充等操作;
- 事件总线(EventBus),“发布-订阅模式”的组件通信,不需要显式注册到其他组件中;
- I/O,简化I/O尤其是I/O流和文件的操作,针对Java5和6版本;
- 反射(Reflection),Guava 的 Java 反射机制工具类;
- 散列(Hash),提供比 Object.hashCode()更复杂的散列实现,并提供布鲁姆过滤器的实现。
Joda Time
你觉得一个 API 设计得差到什么份上,才会把自己差不多的 API 全部 Deprecated 掉。java.util.Date 便是这样的奇葩。因为它的 API 几乎都是反直觉的,几乎所有敢于用它的 Java 程序员都吃过它的亏。想初始化个 2013 年的第一天,还真不那么容易:
Date firstDayOf2013 = new Date(113, 0, 1);
如果你是个 Java 新手,你能猜出 113 是从哪来的吗?(好吧,它是 2013-1900,至于为什么是 1900,这真得问 API 的设计者了)。
Joda Time 就是人们实在无法忍受这样东西的产物。同样的代码用 Joda Time 实现:
DateTime firstDayOf2013 = new DateTime().withDate(2013, 1, 1);
无论如何,你知道这能看出这些参数的含义了。不只如此,你还可以计算两天后是什么日子:
firstDate.plusDays(2);
日期格式化,也是 JDK Date 系列 API 里一大特色,你必须把代码写成下面这样:
new SimpleDateFormat("yyyy.MM.dd").format(firstDayOf2013)
作为一个初始化很慢的构造函数,你还必须每次调用,因为它不是线程安全的。同样的代码,在 Joda Time 里,我们可以用 DateTimeFormatter:
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy.MM.dd");
...
formatter.print(dateTime);
请尽管放心大胆把 formatter 声明成一个字段,因为它是线程安全的。
当然,Joda Time 的强大远不止于此。当然,JDK 也并不是那么完全的自暴自弃,于是,有了一个 JSR 310 专门设计新的 Date API。JSR 310 的 spec lead 是Steven Colebourne,此人正是 Joda Time 的作者。不过,虽然 JSR 310 为我们描绘了 Date 的全新景象,但 Java 8 出来之前就先别打它的主意了,乖乖地用 Joda Time 吧,下载 Joda Time(IBM,SourceForge)。
关于 Joda Time 更多资料,查看 Joda-Time 简介。
Hamcrest
一句话,如果你写单元测试,就应该用 Hamcrest。
如今不写单元测试,你都不好意思说自己在做工程项目了。但你一般这么写断言呢?如果你还写成下面这样,我只能说你落伍了:
assertEquals(a, b);
请告诉我,哪个是执行结果,哪个是预期结果,不管你是怎样,反正大多数情况下,我是记不住的。所以,这个在只重功能,不重可读性年代产生的 API 该更新了。于是,Hamcrest 就是为了解决这样的问题而生的。
assertThat(a, is(b));
很明显,前面一个是执行结果,后面一个是预期结果,当然这只是一个简单的例子。由于 Hamcrest 引入了 matcher 的概念(就是你看到的is部分),我们可以进行更多的组合:
assertThat(number, greaterThan(5));
assertThat(text, startsWith("Hello"));
assertThat(array, hasItem("World"));
Hamcrest 如此好用,以至于 JUnit 已经将其吸纳进去。如果你现在用的 JUnit 是 4.4 之后的版本,那你已经有了 Hamcrest。无需额外的配置,就可以拿过来用。
Mockito
写单元测试不用 Mock 框架几乎是一件不可能的事,我是说 Mock 框架,不是 Mock 模式哦!对于老 Java 程序员来说,提起 Mock 框架,率先在脑海中撞线的多半是 JMock 或EasyMock。
使用 Mockito,只要有一个理由就够了,简单。相比于JMock,它不用写 checking,相比于EasyMock,它省去了replay。下面是个例子:
List mockedList = mock(List.class);
when(mockedList.get(0)).thenReturn("first");
System.out.println(mockedList.get(0));
当然,Mockito还是非常强大的。
最后再强调一遍,无论使用哪个框架,请尽量不要使用verify,也就是传说中的Mock模式,那是把代码拉入泥潭的开始。
SLF4J 和 Logback
日志几乎是稍微有点规模的项目躲不开的一个东西,如果你是个老Java程序员,你必然知道 Log4J,多半也知道 Commons Logging。是时候把它们扔掉了,因为有 SLF4J 和Logback 了。SLF4J 要替代 Commons Logging,而 Logback 的目标是 Log4J。
程序员里愤青多,SLF4J 和 Logback 的作者就是一个,他叫 Ceki Gülcü,事实上,他也是 Log4J 的作者。Log4J 的开发状态实在让他太不爽了,于是,他另起炉灶,打造出新的替代品。
只凭一点就足以让我们对 SLF4J 义无反顾了,你还记得用 Commons Logging 写出这样的代码吗?
if (logger.debugEnable()) {
logger.debug("Hello, ", name);
}
而 SLF4J 的写法只有一句话:
logger.debug("Hello, {}", name);
从根源来说,这是时代造成的,Commons Logging 是 Java 5 之前产生的,那时候还没有变参,所以,我们不得不说,它老了。
至于 Logback,性能是最重要的噱头,当然,还有一些其它的理由。理由里有一点并未提及,但对于开发人员很贴心的改进,就是日志模式的改进,还记得 Log4J 那密码一样的日志模式吗?
%d{dd MMM yyyy HH:mm:ss} [%t] %-5p %m%n
下面是 Logback 的版本,不用查文档,我也看出每段表示的都是什么:
%d{dd MMM yyyy HH:mm:ss} [%thread] %-5level %msg%n
这里介绍的几个程序库都是很通用的,无论是你做怎样的开发,应该都或多或少给你一些帮助。时间未曾停步,Java 开发也未曾停留,如果你是个老Java程序员,是时候更新一下自己的知识了。
你应该更新的 Java 知识之常用程序库【转载】的更多相关文章
- 应该更新的Java知识之常用程序库
摘自:http://www.blogbus.com/dreamhead-logs/226738702.html 在很多人眼中,Java已经是一门垂垂老矣的语言,但并不妨碍Java世界依然在前进.如果你 ...
- <转载> 你应该更新的Java知识之常用程序库(一)
原文出处:http://www.blogbus.com/dreamhead-logs/226738702.html 很多人眼中,Java已经是一门垂垂老矣的语言,但并不妨碍Java世界依然在前进.如果 ...
- 你应该更新的 Java 知识
作者:dreamhead 出处:<你应该更新的Java知识>系列 你应该更新的 Java 知识 Tag:你应该更新的Java知识 Java Guava 集合 版权声明:转载时请以超链接形式 ...
- 2016年6月20日 JAVA知识框架
基于 J2EE 列举的知识架构,大体列举开发基础知识.帮助我随时查缺补漏,奉行好记性不如烂笔头.写了这该随笔,以便后续查询. 1 JAVA简介 2 JAVA编程环境 3 JAVA基本编程结构 4 ...
- JAVA程序员常用英语
JAVA程序员常用英语 干程序员这行实在是离不开英语,干程序员是一项很辛苦的工作,要成为一个高水平的程序员尤为艰难.这是因为计算机软件技术更新的速度越来越快,而这些技术大多来源于英语国家,我们在引进这 ...
- 实现网络数据提取你需要哪些java知识
本篇对一些常用的java知识做一个整合,三大特性.IO操作.线程处理.类集处理,目的在于能用这些只是实现一个网页爬虫的功能. Ⅰ 首先对于一个java开发的项目有一个整体性的了解认知,项目开发流程: ...
- 随笔编号-16 JAVA知识框架
基于 J2EE 列举的知识架构,大体列举开发基础知识.帮助我随时查缺补漏,奉行好记性不如烂笔头.写了这该随笔,以便后续查询. 1 JAVA简介 2 JAVA编程环境 3 JAVA基本编程结构 4 ...
- Hadoop入门 集群常用知识与常用脚本总结
目录 集群常用知识与常用脚本总结 集群启动/停止方式 1 各个模块分开启动/停止(常用) 2 各个服务组件逐一启动/停止 编写Hadoop集群常用脚本 1 Hadoop集群启停脚本myhadoop.s ...
- 基于java平台的常用资源整理
这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...
随机推荐
- laravel使用when搜索遇到状态参数(有0的状态)的坑
今天,使用when()方法写活动列表的接口,有两个状态搜索,都有0这个状态,当传参为0时when()就失效了... 反反复复的验证参数,传参确实是0和1啊...百思不得其解~~~后面仔细想想when( ...
- Memcached和Redis
作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ Memcached和Redis ...
- 步步为营-58-SQLite的使用
说明:文档型关系数据库,多用于移动端 1.1 添加引用 ` 1.1.1 System.Data.SQLite.xml 1.1.2 System.Data.SQLite.dll 1.2 连接字符串的设置 ...
- 怎么用pr(Premiere)给视频添加水印
自己辛辛苦苦剪切的视频,不添加水印,别人肯定会搬走的,作为对视频付出时间的你肯定不想看见这样的事情,下面一起来看看怎么用pr给视频添加水印吧 工具/原料 水印 pr 方法/步骤 首先打 ...
- Hibernate之关联关系映射(一对多和多对一映射,多对多映射)
~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习一下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...
- #12【BZOJ3003】LED BFS+状压DP
题解: 看到区间修改先想一下差分 这题用差分是为了分析问题 现在的问题就变成了 原序列全为0,要使得特定的k个点变为1,每个操作改变x,y+1 然后我们会发现 对于二元组a,b我们要修改它,实际上是在 ...
- day9--队列queue
queue队列 Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递.一个线程放入数据,另外 ...
- PLSQL程序设计(Oracle)
Hello World set serveroutput on; declare --说明部分 begin --程序 dbms_output.put_line('Hello World'); end; ...
- Codeforces 891C Envy
Envy 感觉这种最小生成树上的啥题都差不多的解法.. #include<bits/stdc++.h> #define LL long long #define fi first #def ...
- Linux 之 Makefile 报错
1. 在make命令后出现这种错误提示,是提示第4行没有分隔符. 例如: 1 target:prerequisites ...... 4 command …… 改为: 1 target:prerequ ...