些库有的解决了平时常见又重要的问题,有的则让Coding变得更惬意,值得全速跟进了解!

原文

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

Guava

一句话,只要你做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程序员,是时候更新一下自己的知识了。

原文链接

  • 你应该更新的Java知识之常用程序库(一)
  • 你应该更新的Java知识之常用程序库(二)

from: http://oldratlee.com/post/2013-02-02/new-popular-java-libraries

你应该更新的Java知识之常用程序库相关推荐

  1. 你应该更新的Java知识

    原文链接:http://www.blogbus.com/dreamhead-logs/236028457.html 你应该更新的Java知识之常用程序库(一) 你应该更新的Java知识之常用程序库(二 ...

  2. java 声明一个bus类_第11章 新特性 – 你应该更新的Java知识之Observer - Java 基础入门笔记...

    作为一个Java程序员,不熟悉设计模式简直不好意思和人打招呼,而Observer模式可以说是位列最常用的设计模式之列,虽然有时候在具体代码里,它不一定叫这个名字,比如改头换面叫个Listener,但模 ...

  3. 【Java从0到架构师】Linux 基础知识、常用命令

    Linux 基础知识.常用命令 Linux 基础知识 内核和发行版 常见的 Linux 发行版 Linux 的应用领域 Linux 与 Windows 的区别 Linux 常用命令 *系统目录结构 s ...

  4. Java知识全面总结:并发编程+JVM+设计模式+常用框架+....

    本文整理的Java知识体系主要包括基础知识,工具,并发编程,数据结构与算法,数据库,JVM,架构设计,应用框架,中间件,微服务架构,分布式架构等内容.同时也有作为程序员的一些思考,包含了作为一个Jav ...

  5. Java 知识全面总结:并发编程+JVM+设计模式+常用框架+....

    本文整理的Java知识体系主要包括基础知识,工具,并发编程,数据结构与算法,数据库,JVM,架构设计,应用框架,中间件,微服务架构,分布式架构等内容.同时也有作为程序员的一些思考,包含了作为一个Jav ...

  6. 最全面的Java面试题-----是你更好的掌握java知识

    最全面的Java面试题-----是你更好的掌握java知识 目录 l     概念题--- 1 一.        JAVA基础--- 1 1)      面向对象的特征--- 1 2)      什 ...

  7. 001 JAVA知识体系

    JAVA知识体系 j2se 1.Java语言基础 具体包括:1.对象的初始化:2.继承时,对象的初始化过程:3.关于构造方法:4.有关public.private和protected:5.抽象类:6. ...

  8. 收录Java程序员常用英语

    Java程序员常用英语 基础----进阶 A. array数组accessible 可存取的  area面积audio 音频   addition  加法  action 行动  arithmetic ...

  9. 万字 Java 知识地图助你成为 Offer 收割机

    点击关注"码海" 右上角"设为星标"好文章送达比别人快 我相信这些读者或多或少都有一些 Java 基础,但由于看不到全貌,学了一段时间很容易迷失.所以我在寻思着 ...

最新文章

  1. thinkphp验证是否登录并跳转
  2. Ubuntu 16.04下的LAMP环境配置
  3. SQL中Group By的用法整理
  4. 何时创建MVC应用程序
  5. php 解析返回的xml,php解析xml的几种方式
  6. php:两个文件夹递归地比较,没有的文件自动复制过去
  7. GIS案例练习-----------第六天
  8. 微信小程序服务器配置流程 免费开启HTTPS
  9. FFmpeg合并ts文件为mp4文件
  10. 【零基础学Python】Day7 Python基本数据类型之Set
  11. SRE(运维工程师)的核心能力
  12. 使用Matplotlib绘制3D图形
  13. windows server 2003 工具资源命令集
  14. Oracle与SQL *PLUS简介
  15. SpringSecurity(二) :授权流程
  16. CentOS7.9通过RealVNC实现多人使用服务器桌面
  17. Oracle Overview
  18. 机器学习-fp16表示
  19. FPS游戏中的同步算法
  20. 基于python的网络爬虫技术_基于python的网络爬虫技术的研究

热门文章

  1. schedule() 和 scheduleAtFixedRate() 的区别--转载
  2. 随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比
  3. 阿里巴巴集团CTO王坚:互联网、数据和计算
  4. jvm性能调优实战 - 30使用jmap和jhat摸清线上系统的对象分布
  5. 白话Elasticsearch20-深度探秘搜索技术之使用rescoring机制优化近似匹配搜索的性能
  6. Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡
  7. Oracle-Materialized View解读
  8. java品酒会,我学 rxjava 2(3)- 热发射
  9. 限招2019应届计算机毕业生,2019年计算机专业应届毕业生自我鉴定
  10. java的lr词法编译器_Sample语言编译器(词法分析、正规式、LL、LR、 算符优先)...