Apache Jakarta Common Lang 介绍
无论你在开发哪中 Java 应用程序,都免不了要写很多工具类/工具函数。你可知道,有很多现成的工具类可用,并且代码质量都很不错,不用你写,不用你调试,只要你发现。
在 Apache Jakarta Common 中, Lang 这个 Java 工具包是所有 Apache Jakarta Common 项目中被使用最广泛的,几乎你所知道的名气比较大的软件里面都有用到它,包括 Tomcat, Weblogic, Websphere, Eclipse 等等。我们就从这个包开始介绍整个 common 项目。
Lang 中最大的也是最常用的类是 StringUtils, StringUtils 最常用的函数是 isEmpty。这里举一个例子让你熟悉一下:
String str = null;
if(StringUtils.isEmpty(str)){
}
str = StringUtils.lowerCase(str);
str = StringUtils.capitalize(str);
str = StringUtils.swapCase(str);
StringUtils.isNumeric(str);
StringUtils.isAsciiPrintable(str);
StringUtils.equalsIgnoreCase(str,"");
其中,
if(StringUtils.isEmpty(str)){
}
相当于
if(str == null || str.length() == 0){
}
从以上代码可以看出这个工具类的特点:
第一、这些函数都是静态函数,并且很少抛出异常,也很少抛出控制针异常。
第二、这些函数的功能大多是增强标准 Java 中 java.lang.String 类的功能。
其实,整个 lang 包的函数基本上都在增强 java.lang 包的功能。一个有趣的设计是,虽然 StringUtils 里面的函数都是静态函数,按照通常的做法,会把构造函数设计成 private, 但是不!StringUtils 的构造函数是 public 的。构造函数里面的注释写着 "no init"。这就有意思了,你可以 new 一个 StringUtils,虽然没有特别的好处,但是也没有特别的坏处;你可以写一个 StringUtils 的子类,虽然这也不太常见。这里面的思想似乎是,使用这个工具包的软件开发人员想怎么用就怎么用,做工具类的时候不用太多限制。
至于不抛异常是因为现在很多人已经意识到 Java 中的异常不是什么好东西,如果不用异常也能写程序,为什么还要用异常?用了异常就要写很多 try catch,在很多场合,比如 jdbc driver,这已经证明了会使代码量增加并且代码的可读性变差。
这里的思路会不会影响大家写程序的习惯呢?
StringUtils 的函数很多,不一一列举。 Lang 中次重要的类要数 ArrayUtils,主要功能涉及到数组的比较、转换、拆分、合并、查找、增减、倒转等等操作。在 JDK 中,这类操作没有现成的函数。
Lang 中工具类比较多,这里介绍几个主要的:
ClassUtils getShortClassName,这个函数应该在 java.lang.Class 类中有的,我看到很多人自己写这个函数。getAllInterfaces,convertClassNamesToClasses,isAssignable,primitivesToWrappers,isInnerClass。
NumberUtils 关于数字以及数字和字符串转换的类 stringToInt,toDouble,createNumber,isAllZeros, int compare(float lhs, float rhs), isNumber(String str),double min(double[] array)。
RandomUtils 用于产生随机数的。
DateFormatUtils 日期时间格式转换,以及本地时间和 UTC 时间转换。
DateUtils 日期工具类。isSameDay,truncate,round,modify。
基于反射机制的几个类:
CompareToBuilder 比较,用在算法、排序、比较的地方。reflectionCompare,append。
EqualsBuilder 通过反射机制比较。reflectionEquals 很多项目中用到。
HashCodeBuilder 可以通过反射生成 hash code,很多算法的地方涉及到 hash code,但是并不是每个人都知道一种 hash code 的生成方法。
ToStringBuilder 当你需要重载 toString 函数而不想写代码把当前类的所有成员信息列出来,可以用这个函数。
其它的几个类我用得比较少:
SerializationUtils Java 中得序列化比较奥妙,容易出错啊。
SystemUtils 可以读取一些关于 jdk 信息,操作系统信息的工具类。