天天看點

私有構造方法強制不可執行個體化的性質

有時想編寫隻有靜态方法和靜态字段的類。這種類很不好,因為有些人濫用在OOP 語言編寫面向過程的程式,但确有用途。

可用 java.lang.Math 或 java.util.Arrays 這種類,把基本類型的值或數組類型的方法組織起來。

還可以用于對以 java.util.Collections 的方式,把實作特定接口的對象上的靜态方法組織起來。( Java 8,可以将這些方法放入接口中,假設是你自己編寫的可以修改)。最後,這些類還可把 final 類上的方法組織,因為不能将它們放在子類。

這樣的工具類不是為執行個體化而設計:執行個體毫無意義。然而沒有顯式構造方法時,編譯器會提供無參預設構造方法。對使用者來說,這個構造方法與其他構造方法沒差別。在已釋出的 API 中看到無意中執行個體化的類很常見。

通過使類抽象來強制不可執行個體化是行不通的。 該類可被子類化,進而執行個體化子類。還會誤導使用者認為類是為繼承而設計的。

然而,有一個簡單的操作確定不可執行個體化。隻有當類不包含顯式構造方法時,才會生成預設構造方法,是以可以通過包含私有構造方法使類不可執行個體化:

私有構造方法強制不可執行個體化的性質

因顯式構造方法私有,在類外不可通路。AssertionError 不是嚴格要求的,但提供了保障,以防構造方法意外地被調用(比如反射!)。保證類在任何情況下都不會被執行個體化。

這個習慣用法有點違反正常,因為構造方法是明确提供的,但卻不能調用它。是以,通常加個注釋說明就是很好的做法。

也防止了類被子類化,這算是一個副作用吧。

所有子類構造方法都必須調用超類構造方法,無論是顯式的還是隐式的,但這種情況下子類卻沒有可通路的超類構造方法可調用。