對只有靜態方法和域的類,主要用於把基本類型的值或數據類型上的相關方法組織起來(Math,Arrays),可以通過Collections的方法把實現特定接口的對象上的驚天方法組織起來,可以利用這種類把final類上的方法組織起來,以取代擴展該類的做法。此工具類是不希望被實例化的,實例化對他麼有任何意義。然後我們如果不提供構造器,jvm會自己提供,那還是會被實例化,那麼我們只要在類中提供一個私有的構造器就可以了,並添加註釋說明。 這樣帶來的問題是不能子類化,因爲子類要求要求super父類的構造函數。
場景:
在創建工具類的時候,大部分是無需實例化的,實例化對它們沒有意義。在這種情況下,創建的類,要確保它是不可以實例化的。
存在問題:
在創建不可實例化的類時,雖然沒有定義構造器。但是,客戶端在使用該類的時候,依然可以實例化它。客戶端,可以繼承該類,通過實例化其子類來實現實例化;客戶端可以調用默認的構造器來實例化該類。
要避免這個問題,使用的方式是,定義一個私有的構造器:
public class UtilityClass {
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
}
添加 throw new AssertionError(),是避免在UtilityClass實例化UtilityClass類。
因爲有了私有的無參構造器,這樣客戶端就沒有辦法調用默認構造器來實例化該類;也避免了繼承的子類被實例化的問題。