你应该更新的Java知识之常用程序库【转载】

在很多人眼中,Java 已经是一门垂垂老矣的语言,但并不妨碍 Java 世界依然在前进。如果你曾离开 Java,云游于其它世界,或是每日只在遗留代码中挣扎,或许是时候抬起头,看看老 Java 中的新东西。

Guava

Guava[gwɑ:v?],一句话,只要你做Java项目,就应该用Guava

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);

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吧。

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 框架,率先在脑海中撞线的多半是 JMockEasyMock

使用 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。是时候把它们扔掉了,因为有 SLF4JLogback 了。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程序员,是时候更新一下自己的知识了。

时间: 2024-11-10 01:11:24

你应该更新的Java知识之常用程序库【转载】的相关文章

你应该更新的 Java 知识之常用程序库

在很多人眼中,Java 已经是一门垂垂老矣的语言,但并不妨碍 Java 世界依然在前进.如果你曾离开 Java,云游于其它世界,或是每日只在遗留代码中挣扎,或许是时候抬起头,看看老 Java 中的新东西. Guava Guava[gwɑ:v?],一句话,只要你做Java项目,就应该用Guava(Github).官方 API. guava 是 Google 出品的一套 Java 核心库,在我看来,它甚至应该是 JDK 的一部分.作为一个 Java 程序员,如果你没抱怨过JDK的设计,只能说明一点,

[每日更新-MySQL基础知识]6.常用数据类型-日期时间

1.    日期和时间 日期和时间类型在数据库中也非常重要,比如我们在数据库中新增了一个用户,我们就应该要存储用户加入的时间,方便以后的查询. 还有比如我们在记录日志的时候,谁操作了哪个地方,我们也需要有时间的参与,才能知道,谁在什么时候操作了什么. 1.1    日期时间 表示:datetime / date /year/time/timestamp 1.2    datetime / date / year /time date 保存的是年月日. datetime保存的是 年月日时分秒 ye

Java EE中常用的四个框架

Java EE中常用的四个框架     Struts     Struts是一个基于Sun Java EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的.     Struts框架可分为以下四个主要部分,其中三个就和MVC模式紧密相关:     1.模型 (Model),本质上来说在Struts中Model是一个Action类(这个会在后面详细讨论),开发者通过其实现商业逻辑,同时用户请求通过控制器(Controller)向Action的转发过程是基于由struts-config

[Java,JavaEE] 最常用的Java库一览

引用自:http://www.importnew.com/7530.html 本文由 ImportNew - 邢 敏 翻译自 programcreek.欢迎加入Java小组.转载请参见文章末尾的要求. 写在前面: 1) 本文列出的名单是根据我自己的调查,并结合个人的经验.有可能是它们不恰恰是最流行的,但至少众所周知的. 2) 我会不断更新这个列表,使之更加完整和准确.感谢您的意见. 一个典型的Java项目依赖于第三方库.本文总结的Java库适用于各种应用,比较流行并且广泛使用.其中一些还提供简单

2016年6月20日 JAVA知识框架

基于 J2EE 列举的知识架构,大体列举开发基础知识.帮助我随时查缺补漏,奉行好记性不如烂笔头.写了这该随笔,以便后续查询. 1  JAVA简介 2  JAVA编程环境 3  JAVA基本编程结构 4  对象和类 5  继承 6  接口和内部类 7  图形编程 8  事件处理 9  Swing用户界面组建 10  部署applet和应用程序 11  异常和调试 12  流与文件 13  SSH框架 自己脑海要有一个知识框架,这是实现一专多长的重要条件.后续会联系更新以上分类知识.

这里整理了基于java平台的常用资源

这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.thanks. 构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化的方式进行配置,所以维护起来相当困难. Gradle:Gradle采用增量构建.Gra

hadoop java接口及常用api

# java接口及常用api package com.yting.hadoop.hdfs; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputS

Java几种常用的实现排序方法

import java.util.Random; public class NumberSort{ /** * 私有构造方法,禁止实例化 */ private NumberSort(){ super(); } /** * 冒泡排序 * 比较相邻的元素.如果第一个比第二个大,就叫唤他们两个位置. * 对每一组相邻的元素作同样的工作,从开始的第一对到结束后的最后一对,这样剩下的最后一个应该是最大的数. * 针对所有元素重复以上操作,除了最后一个. * 持续对越来越少的数进行以上的操作,直到没有任何一

java 知识收集

1,若方法传入的对象参数为空,则在方法中改变参数并不会改变声明的对象 public void setList(List<String> list){ list = new ArrayList<String>() ; } @Test public void t4(){ List<String> list = null ; setList(list); System.out.println(list );//输出 null } 2,不要再foreach遍历的时候删除 jav