有些時候,你可能需要編寫只含靜態(tài)方法和靜態(tài)域的類肛真,例如:
(1)java.lang.Math:組織數(shù)學(xué)計算有關(guān)函數(shù)氓英。
(2)java.util.Arrays:把基本類型值或數(shù)組類型上的靜態(tài)方法組織起來。
(3)java.util.Collections:把實現(xiàn)特定接口的對象上的方法組織起來拷沸。
這種工具類(utility class)不希望被實例化中姜。為了防止無構(gòu)造器情況下編譯器自動提供一個公有的消玄、無參的缺省構(gòu)造器,不能使用將類定為抽象類這種方法扎筒,而應(yīng)該使這個類顯式地包含私有構(gòu)造器莱找,這樣他就不能被實例化了:
public class Collections {
// Suppresses default constructor, ensuring non-instantiability.
private Collections() {
throw new AssertionError();
}
...
}
AssertionError不是必須的,但它可以避免不小心在類內(nèi)部調(diào)用構(gòu)造器嗜桌。加注釋是為了說明這個構(gòu)造器就是專門設(shè)計成不能被調(diào)用一樣奥溺。
私有化構(gòu)造器使得一個類不能被子類化。因為子類需要顯式或隱式地調(diào)用父類的構(gòu)造器骨宠,而私有化構(gòu)造器使得子類沒有可訪問的父類構(gòu)造器可調(diào)用了浮定。