有些時候,你可能需要編寫只含靜態(tài)方法和靜態(tài)域的類罢防,例如:
(1)java.lang.Math:組織數(shù)學計算有關函數(shù)。
(2)java.util.Arrays:把基本類型值或數(shù)組類型上的靜態(tài)方法組織起來唉侄。
(3)java.util.Collections:把實現(xiàn)特定接口的對象上的方法組織起來咒吐。
最后,還可以利用這種類把final類上的方法組織起來,以取代擴展該類的做法恬叹。
這種工具類(utility class)不希望被實例化候生。為了防止無構造器情況下編譯器自動提供一個公有的、無參的缺省構造器绽昼,不能使用將類定為抽象類這種方法唯鸭,而應該使這個類顯式地包含私有構造器,這樣他就不能被實例化了:
public class Collections{
// Suppresses default constructor, ensuring non-instantiability.
private Collections(){
thrownewAssertionError();
}
...
}
AssertionError不是必須的硅确,但它可以避免不小心在類內(nèi)部調(diào)用構造器目溉。加注釋是為了說明這個構造器就是專門設計成不能被調(diào)用一樣。
副作用:私有化構造器使得一個類不能被子類化疏魏。因為子類需要顯式或隱式地調(diào)用父類的構造器停做,而私有化構造器使得子類沒有可訪問的父類構造器可調(diào)用了。