在很多人眼中,Java 已经是一门垂垂老矣的语言,但并不妨碍 Java 世界依然在前进。如果你曾离开 Java,云游于其它世界,或是每日只在遗留代码中挣扎,或许是时候抬起头,看看老 Java 中的新东西。
Guava
Guava[gwɑ:və],一句话,只要你做Java项目,就应该用Guava(Github)。
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);
- 缓存(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常用实例程序Java常用实例程序Java常用实例程序Java常用实例程序Java常用实例程序Java常用实例程序Java常用实例程序
JAVA面向对象程序设计试题与解析库 给出许多题目, 而且有答案和讲解。 可以作为毕业生找工作的参考学习资料
二级java 公共基础知识部分30分 专业语言部分 70分 Java语言程序设计 基本要求: 1. 掌握Java语言的特点,实现机制和体系结构。 2. 掌握Java语言中面向对象的特性。 3. 掌握Java语言提供的数据类型和结构。 4. 掌握...
java-ssm中医知识库微信小程序毕业论文.doc
面试题汇总:Markdown编写,作为Java知识库提供给Java面试必考小程序使用.zip
收入JAVA入门程序的案例,包括(JAVA语法基础,J2SE常用包,JAVA SWING 记忆JDBC连数据库技术)。这些例子非常容易理解,让能很快弄懂JAVA基础知识,对于入门者来说非常实用!
一些PYTHON常用库 一些PYTHON常用库 一些PYTHON常用库
Boost是一个功能强大、构造精巧、跨平台、开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉。 它由C++标准委员会部分成员所设立的Boost社区开发并维护,使用了许多现代C++编程技术,内容涵盖字符串...
java聊天室程序源码 2 需求分析 2.1 业务需求 1. 与聊天室成员一起聊天。 2. 可以与聊天室成员私聊。 3. 可以改变聊天内容风格。 4. 用户注册(含头像)、登录。 5. 服务器监控聊天内容。 6. 服务器过滤非法内容。 7...
由于程序库本身并不容易,为了完整运用其组件并从其强大的威力中获得帮助,你需要一份完善的资源,而非一份仅仅陈列类和函数的普通文档。 《The C++ Standard Library》(中文版《C++ 标准程序库》)不仅对每一个...
本习题集收集了Java程序编写常见问题,并以习题形式总结和归纳Java程序设计知识要点,同时兼顾了SCJP(Sun公司 Java程序员认证考试),从而降低学习难度,减少编写程序出现错误的枘地,也便于掌握各个知识要点或测试...
c 标准程序库-自修教本与参考工具 侯捷 孟岩 译 巨细靡遗·井然有序(侯捷译序) 孟岩译序 目录 前言 致谢 1.关于本书 2.C 及其标准程序库简介 3.一般概念 4.通用工具 5....
目录第1章 Java语言基础知识 1.1 Java语言与面向对象的程序设计 1.1.1 面向对象的程序设计思想 1.1.2 Java语言的特点 1.1.3 Java类库 1.2 Java程序概述 1.2.1 Java开发环境 1.2.2 Application举例 1.2.3 ...
不错的Java小程序,适合初学者学习和交流
java 聊天程序 代码
这是一些DSP的C程序和汇编程序库常用例程集
Java程序性能优化——让你的Java程序更快、更稳定
JAVA 开发的 B/S 抽奖程序,非常漂亮,很容易改进!^_^
研究生java 课件 配套Java程序设计实用教程 附带源代码
Java Web程序设计教程 Java Web程序设计教程