我最感兴趣的是string util类、stringutils、randomstringutils和charsetutils。他们是string taglib的主干部分,也是我花功夫最多的类。自然,我觉得它们非常有用,每天都在用他们。关于stringutils类最值得关注的特性如下:
capitalise(string):一个string大写化函数(这里保留了英式拼法),它不像大多数字符串库那样使用touppercase,而是恰当地使用了totitlecase。
join(object[], string):它把对象数组里每个对象的tostring合并成带有指定定界符的单个string。所以join( {"a","b",c"}, ";")的结果是"a;b;c"。iterator也可以被连接。
split(string, string):它能分割带有定界符的文本。其功能没有stringtokenizer(它不能一次处理多组定界符)强大,但是能够很快、很容易地应用于很多场合。它是上一个合并方法的反向操作:split("a;b;c",";") => {"a", "b", "c"}。这个分割方法现在已经可以在 jdk 1.4的java.lang.string里找到了。
reversedelimitedstring(string, string):这是个很有趣的方法。它能以定界符为基础颠倒一段文本。所以:reversedelimitedstring("org.apache.commons")的结果就变成了"commons.apache.org."
replace(string, string, string):这个string替换方法常常是很让人期待的。jdk1.4能够使用正规表达式解决这个问题,但是stringutils类所提供的基于string更简单的版本更常用。
randomstringutils是一个设计用来随机生成文本位的类,这在密码的生成上很常见。其全部范围是unicode,并且支持英文字母、ascii码、asciinumeric和数字的特别重载。我希望在将来能把它插入到一个更大的随机化框架里,并使其更加本土化。
例外
在过去几年中,我所见过最通用的可重用类之一就是好用的nestedexception或者cascadedexception。现在在jdk 1.4的java.lang.throwable里,例外的子工具包是一组尝试处理大多数执行的类,这个子工具包在commons lang的beta版里只是一个执行。
这个东西看起来不像是很有用,习惯jdk 1.3的人可以使用一个执行,习惯jdk 1.4的人可以使用sdk版。重要的是要记住,commons lang最大的用户就是jakarta项目本身,这个项目包含的许多子项目都能用户同时多个版本的java来工作。
隐藏在exceptionutils里的是个有用的方法:
string getstacktrace(throwable)把throwable转换成string这是涌现出来的众多string工具之一。
enum
在java刚刚发布的时候,它被看成是另一个版本的c语言。更加明智的人(我不在其中,当时我自己还拥有一个已经快不行了的amiga)指出来它只是像c,其核心特性和其它语言有巨大的区别;而当时很多人还在疑惑:它去掉了c的哪个部分,并想知道为什么。位于列表榜首的,或者说接近榜首的,是c enum声明。其经典用法是实现代码位,例如:
enum day {monday, tuesday, wednesday, thursday, friday, saturday, sunday};
这允许monday被自动赋值为0,tuesday被赋值为1,依此类推。然后,编译器密切注意日期变量类型,并帮助程序员避免不可预计的错误。
java里有一些问题都有这样一个东西――那就是java真正的常数都不能活过rmi或者多classloading――lang enum类面对rmi时能够很好地处理自身,只要你避免使用全等(==)比较方法。使用lang enum日期计数器的例子在listing a里有。
是的,它比c版本的要长得多,但是这是语言里没有句法的必然结果。
生成器
我所要讨论的org.apache.commons.lang工具包的最新子工具包是生成器。这个工具包里的类使创建诸如等式、tostring、hashcode和compareto这些标准方法变得更容易、更安全。hashcode生成和等式生成器都遵从joshua bloch在他经典的《有效的java:编程指导(effective java: programming language guide)》里指定的规则。例如,要编写一个好的hashcode方法,你可以仔细考虑,也可以这样做:
public int hashcode() {
return new hashcodebuilder(17, 37).append(width)
.append(height)
.append(z)
.append(name)
.tohashcode();
}
要编写一个简单的等式方法,这样做:
public boolean equals(object obj) {
if(!obj instanceof thisclass) { return false; }
thisclass tc = (thisclass)obj;
return new equalsbuilder().test(name, tc.name)
.test(age, tc.age)
.test(postcode, tc.postcode)
.isequals();
}
这些生成器类的学习曲线要略高于简单公共静态函数的,但是其回报,即减轻了开发难度,是相当明显的。
这个工具包里的其他东西
org.apache.commons.lang工具包里还有其他的类,例如用于表示一组数字的numberrange类,以及numberutils类,它包含了各种有用的函数,例如string到数字的转换和最大/最小方法。此外不要忘了objectutils,你可以用它来为对象创建缺省的tostring方法,甚至是在tostring被强制替代时。
而且,systemutils允许你轻易地访问一些标准的java环境变量,serializationutils也让串连对象变得容易得多。
总括
我只是很快地谈了一下commons lang api,跳过了很多方法,但是希望能够让大家对这个api留下一个总体的好印象。它的设计初衷就是要让你的java项目更容易一点。
闽公网安备 35060202000074号