原文地址: itweknow.cn/detail?id=5… ,歡迎你們訪問。java
在實際的搬磚過程當中,咱們常常會寫一些方便咱們工做的工具類,通常來說這類工具類是不但願被實例化的,由於實例對他們來說沒有任何的意義,畢竟它們不存儲任何的數據。工具
這應該是咱們編寫工具類的時候最多見的了,由於不須要實例化,因此咱們通常都懶得去編寫構造方法,可是咱們忽略了編譯器會爲其提供一個默認的無參構造器,對於用戶而言這個構造器和其餘構造器沒有任何區別。並且咱們會發如今實際編碼中咱們有時候會無心識地實例化這些類。形成了資源的浪費。編碼
或許咱們會想到經過抽象類來強制這種工具類不被實例化,可是這是行不通的。由於該類能夠被子類化,而且該類的子類能夠被實例化,這樣作還可能會誤導用戶,覺得這種類是專門爲繼承而設計的。spa
Java編譯器只有當類不包含顯式構造器的時候纔會生成缺省構造器,因此咱們只須要讓這個類包含一個私有的顯式構造器,它就不能被實例化了。設計
public class Example {
public static void test() {}
public static void test2() {}
private Example() {
}
}
複製代碼
看過上一條的同窗應該知道,咱們能夠經過反射來強制調用私有構造器進而得到該類的實例,因此還須要改進一下。code
public class Example {
public static void test() {}
public static void test2() {}
private Example() {
throw new AssertionError();
}
}
複製代碼
雖然通常來說,AssertionError
並非必須的,可是這樣能夠避免咱們不當心在類內部調用構造器也能夠防止用戶經過反射來獲取新實例。繼承