你应该更新的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 框架,率先在脑海中撞线的多半是   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 程序员,是时候更新一下自己的知识了。

全部评论

相关推荐

风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
点赞 评论 收藏
分享
若怜君欢:驾驶证去掉吧,PPT啥的也去掉,本硕课程去掉,导师和研究方向去掉;加入本硕排名(好才写);技能栏加入你会的那些控制算法和滤波算法,这个比你会啥啥啥软件更有用;获奖写上去,奖学金啊,有没有专利啊之类的 电机和硬件这一块,属于传统制造业,制造业实习并不多。多投一些攒攒经验,有实习最好,没有也不需要焦虑(制造业实习其实除了转正,没多大用处) 最后,划重点,等秋招开始后,把你所有社交软件都发一份简历上去,并经常更新,找人内推你!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务