無論你在開發(fā)哪中 Java 應用程序,都免不了要寫很多工具類/工具函數。你可知道,有很多現成的工具類可用,并且代碼質量都很不錯,不用你寫,不用你調試,只要你發(fā)現。
在 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){
}
從以上代碼可以看出這個工具類的特點:
第一、這些函數都是靜態(tài)函數,并且很少拋出異常,也很少拋出控制針異常。
第二、這些函數的功能大多是增強標準 Java 中 java.lang.String 類的功能。
其實,整個 lang 包的函數基本上都在增強 java.lang 包的功能。一個有趣的設計是,雖然 StringUtils 里面的函數都是靜態(tài)函數,按照通常的做法,會把構造函數設計成 private, 但是不!StringUtils 的構造函數是 public 的。構造函數里面的注釋寫著 "no init"。這就有意思了,你可以 new 一個 StringUtils,雖然沒有特別的好處,但是也沒有特別的壞處;你可以寫一個 StringUtils 的子類,雖然這也不太常見。這里面的思想似乎是,使用這個工具包的軟件開發(fā)人員想怎么用就怎么用,做工具類的時候不用太多限制。
至于不拋異常是因為現在很多人已經意識到 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 信息,操作系統(tǒng)信息的工具類。