你应该更新的Java知识之常用程序库
些库有的解决了平时常见又重要的问题,有的则让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知识之常用程序库相关推荐
- 你应该更新的Java知识
原文链接:http://www.blogbus.com/dreamhead-logs/236028457.html 你应该更新的Java知识之常用程序库(一) 你应该更新的Java知识之常用程序库(二 ...
- java 声明一个bus类_第11章 新特性 – 你应该更新的Java知识之Observer - Java 基础入门笔记...
作为一个Java程序员,不熟悉设计模式简直不好意思和人打招呼,而Observer模式可以说是位列最常用的设计模式之列,虽然有时候在具体代码里,它不一定叫这个名字,比如改头换面叫个Listener,但模 ...
- 【Java从0到架构师】Linux 基础知识、常用命令
Linux 基础知识.常用命令 Linux 基础知识 内核和发行版 常见的 Linux 发行版 Linux 的应用领域 Linux 与 Windows 的区别 Linux 常用命令 *系统目录结构 s ...
- Java知识全面总结:并发编程+JVM+设计模式+常用框架+....
本文整理的Java知识体系主要包括基础知识,工具,并发编程,数据结构与算法,数据库,JVM,架构设计,应用框架,中间件,微服务架构,分布式架构等内容.同时也有作为程序员的一些思考,包含了作为一个Jav ...
- Java 知识全面总结:并发编程+JVM+设计模式+常用框架+....
本文整理的Java知识体系主要包括基础知识,工具,并发编程,数据结构与算法,数据库,JVM,架构设计,应用框架,中间件,微服务架构,分布式架构等内容.同时也有作为程序员的一些思考,包含了作为一个Jav ...
- 最全面的Java面试题-----是你更好的掌握java知识
最全面的Java面试题-----是你更好的掌握java知识 目录 l 概念题--- 1 一. JAVA基础--- 1 1) 面向对象的特征--- 1 2) 什 ...
- 001 JAVA知识体系
JAVA知识体系 j2se 1.Java语言基础 具体包括:1.对象的初始化:2.继承时,对象的初始化过程:3.关于构造方法:4.有关public.private和protected:5.抽象类:6. ...
- 收录Java程序员常用英语
Java程序员常用英语 基础----进阶 A. array数组accessible 可存取的 area面积audio 音频 addition 加法 action 行动 arithmetic ...
- 万字 Java 知识地图助你成为 Offer 收割机
点击关注"码海" 右上角"设为星标"好文章送达比别人快 我相信这些读者或多或少都有一些 Java 基础,但由于看不到全貌,学了一段时间很容易迷失.所以我在寻思着 ...
最新文章
- thinkphp验证是否登录并跳转
- Ubuntu 16.04下的LAMP环境配置
- SQL中Group By的用法整理
- 何时创建MVC应用程序
- php 解析返回的xml,php解析xml的几种方式
- php:两个文件夹递归地比较,没有的文件自动复制过去
- GIS案例练习-----------第六天
- 微信小程序服务器配置流程 免费开启HTTPS
- FFmpeg合并ts文件为mp4文件
- 【零基础学Python】Day7 Python基本数据类型之Set
- SRE(运维工程师)的核心能力
- 使用Matplotlib绘制3D图形
- windows server 2003 工具资源命令集
- Oracle与SQL *PLUS简介
- SpringSecurity(二) :授权流程
- CentOS7.9通过RealVNC实现多人使用服务器桌面
- Oracle Overview
- 机器学习-fp16表示
- FPS游戏中的同步算法
- 基于python的网络爬虫技术_基于python的网络爬虫技术的研究
热门文章
- schedule() 和 scheduleAtFixedRate() 的区别--转载
- 随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比
- 阿里巴巴集团CTO王坚:互联网、数据和计算
- jvm性能调优实战 - 30使用jmap和jhat摸清线上系统的对象分布
- 白话Elasticsearch20-深度探秘搜索技术之使用rescoring机制优化近似匹配搜索的性能
- Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡
- Oracle-Materialized View解读
- java品酒会,我学 rxjava 2(3)- 热发射
- 限招2019应届计算机毕业生,2019年计算机专业应届毕业生自我鉴定
- java的lr词法编译器_Sample语言编译器(词法分析、正规式、LL、LR、 算符优先)...