第4條:通過私有構造器強化不可實例化的能力

對只有靜態方法和域的類,主要用於把基本類型的值或數據類型上的相關方法組織起來(Math,Arrays),可以通過Collections的方法把實現特定接口的對象上的驚天方法組織起來,可以利用這種類把final類上的方法組織起來,以取代擴展該類的做法。此工具類是不希望被實例化的,實例化對他麼有任何意義。然後我們如果不提供構造器,jvm會自己提供,那還是會被實例化,那麼我們只要在類中提供一個私有的構造器就可以了,並添加註釋說明。 這樣帶來的問題是不能子類化,因爲子類要求要求super父類的構造函數。

場景:

在創建工具類的時候,大部分是無需實例化的,實例化對它們沒有意義。在這種情況下,創建的類,要確保它是不可以實例化的。

存在問題:
在創建不可實例化的類時,雖然沒有定義構造器。但是,客戶端在使用該類的時候,依然可以實例化它。客戶端,可以繼承該類,通過實例化其子類來實現實例化;客戶端可以調用默認的構造器來實例化該類。

要避免這個問題,使用的方式是,定義一個私有的構造器:

public class UtilityClass {
    // Suppress default constructor for noninstantiability
    private UtilityClass() {
        throw new AssertionError();
    }
}

添加 throw new AssertionError(),是避免在UtilityClass實例化UtilityClass類。

因爲有了私有的無參構造器,這樣客戶端就沒有辦法調用默認構造器來實例化該類;也避免了繼承的子類被實例化的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章