java 項目中使用的工具類非常多,比如JDK自己的工具java.lang.Math 、java.util.Collections 等都是我們經(jīng)常用到的工具類。工具類的屬性和方法都是靜態(tài)的,不需要生成實例即可訪問,而且JDK也做了很好的處理,由于不希望被初始化,于是設(shè)置了構(gòu)造函數(shù)為private的權(quán)限,表示除了此類本身外,誰都不能產(chǎn)生一個實例。
java.lang.Math的部分代碼
public final class Math {
/**
* Don't let anyone instantiate this class.
*/
private Math() {}
}
Math的構(gòu)造函數(shù)設(shè)置成了private了:我就是一個工具類,我只想其它類通過類名來訪問,我不想通實例對象訪問。這在平臺型和框架型項目中已經(jīng)足夠了。但是已經(jīng)告訴你不能這么做了,你還是要實例Math類來訪問屬性和靜態(tài)方法(java反射是如此的發(fā)達(dá),修改一個構(gòu)造函數(shù)的訪問權(quán)限易如反掌),這樣就確保不了正確性了,隱藏的問題隨時都可能爆發(fā)!那我們在項目開發(fā)中有沒有更好的限制辦法呢?有,不僅僅設(shè)置成private訪問權(quán)限,還要拋異常,代碼實例如下:
public class LdapUtils {
private LdapUtils() {
throw new Error("請不要實例化我!");
}
}
這樣做才能確保工具類才能不會被實例化,并且保證所有訪問都是通過類名來進(jìn)行的。需要注意的是,此工具類不能做繼承的打算,因為如果子類可以實例化的話,那就要調(diào)用父類的構(gòu)造函數(shù),可以父類沒有被訪問的構(gòu)造函數(shù),于是問題自然而然就出現(xiàn)了。