有時候,你可能須要編寫至包含靜態方法和靜態域的類。這些類的名聲很很差,由於有些人在面向對象的語言中濫用這樣的類來編寫過程化的程序。java
儘管如此,它們也確實有它們特有的好處:數組
1.利用這種類,以java.lang.Math或者java.util.Arrays的方式,把基本類型的值或者數組類型上的相關方法組織起來.函數
2.咱們也能夠經過java.util.Collections的方式,把實現特定接口的對象上的靜態方法包括工廠方法組織起來。工具
3.利用這種類能夠把final類上的方法組織起來,以取代擴展該類的作法。設計
這樣的工具類Unility class不但願被實例化,實例對它沒有任何意義。然而在缺乏顯示構造器的狀況下,編譯器會自動提供一個公有的,無參的缺省構造器default constructor.對於用戶而言,這個構造器與其餘的構造器沒有任何區別。在已發行的API中經常能夠看到一些被無心識地實例化的類。code
企圖經過將類作成抽象類來強制該類不可被實例化,這是行不通的。該類能夠被子類化,而且該子類也可被實例化。這樣作甚至會誤導用戶,覺得這種類是專門爲了繼承而設計的。然而有一些簡單的習慣用法能夠確保類不可被實例化。因爲只有當類不包含顯示的的構造器時,編譯器纔會生成缺省的構造器,由於咱們只要讓這個類包含私有的構造器,它就不能被實例化了:對象
public class JavaUtil{ //私有的構造函數,該類也不能子類化了,其餘類沒法extends這個類了。 // Suppress default constructor for noninstantiability private JavaUtil(){ throw new AssertError(); } }
該類構造器是私有的,因此不能夠再該類的外部訪問它。AssertionError不是必須的。可是它能夠避免不當心在類的內部調用構造器。它保證該類在任何狀況下都不會被實例化。繼承
可是這種用法有點違背直覺,好像構造器就是專門設計成不能調用同樣。所以明智的作法就是在代碼中增長一條註釋,如: 接口
//Supress default constructor for noninstantiability.