編寫只包含靜態(tài)方法和靜態(tài)域的類,比如我們常寫的Util類烦粒。我們不希望類被實(shí)例化,實(shí)例對它沒有任何意義代赁。
Java在缺少顯式構(gòu)造器的情況下扰她,編譯器會自動提供一個公有的,無參的缺省構(gòu)造器芭碍,有潛在的被實(shí)例化的風(fēng)險徒役。
我們可以顯式的指定一個私有的構(gòu)造器,代碼如下:
// Noninstantiable utility class
public class UtilityClass {
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
}
AssertionError不是必需的窖壕,但是可以避免不小心在類的內(nèi)部調(diào)用構(gòu)造器忧勿,或者是反射攻擊,保證了該類在任何情況下都不被實(shí)例化瞻讽。
注意:沒有公有的構(gòu)造器鸳吸,導(dǎo)致這個類不能被子類化,所有的構(gòu)造器都必須顯式或隱式的調(diào)用超類構(gòu)造器速勇。
另外晌砾,企圖通過將類做成抽象類強(qiáng)制該類不可被實(shí)例化是行不通的。因?yàn)樵擃惪梢员蛔宇惢?/p>