《Effective Java》第4條:經過私有構造器強化不可實例化的能力

原文地址: 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並非必須的,可是這樣能夠避免咱們不當心在類內部調用構造器也能夠防止用戶經過反射來獲取新實例。繼承

相關文章
相關標籤/搜索