有時候可能只需要編寫包含靜態方法和靜態域的類。這些類的名聲很不好,因為有些人再物件導向的語言中濫用這些類來編寫過程化的程式。儘管如此,他們也確實有他們特有的用處。我們可以利用這種類,把基本型別的值或者陣列型別上的相關方法組織起來,也可以把實現特定介面上的靜態方法組織起來,還可以利用這種類把final類上的方法組織起來,以取代擴充套件該類的做法。
這樣的工具類肯定不希望被例項化,因為例項化沒有任何的意義,裡面不管是方法還是變數都是靜態的存在,是該類所有例項所公用的一套。然而,在缺少顯示構造器的情況下,編譯器會自動添上乙個共有的,無引數的預設構造器。
通過將類做成抽象類來強制該類不可被例項化,這是行不通的。該類可以被子類化,並且該子類也可以被例項化。這樣做甚至會讓使用者以為這種類是為了繼承,將類的行為還有屬性專門提取到抽象類裡面去的。然而,有一些簡單的習慣用法可以確保類不可被例項化,由於只有當類不包含顯示構造起的時候,編譯器才會生成預設的構造器,因此我們只需要給這個類包含乙個私有構造器,其就不能通過一般的手段例項化該類:
public class a
}
由於顯示的構造器是私有的,所以不可以在該類的外部訪問它。在a的私有構造器被呼叫的時候會丟擲assertionerror,但這個並不是必須的,只是用來預防在類的內部不小心呼叫到了構造器而已。
這種習慣用法也存在***,它是的乙個類不可以被子類化。所有的構造器都必須顯示的或者隱式的呼叫超類構造器,在這種情況下,該類的子類根本就沒有訪問超類構造器的許可權= =,所以***。
第4條 通過私有構造器強化不可例項化的能力
對只有靜態方法和域的類,主要用於把基本型別的值或資料型別上的相關方法組織起來 math,arrays 可以通過collections的方法把實現特定介面的物件上的驚天方法組織起來,可以利用這種類把final類上的方法組織起來,以取代擴充套件該類的做法。此工具類是不希望被例項化的,例項化對他麼有任何意...
第4條 通過私有構造器來強化不可例項化能力
像有些類裡面可能只包含靜態方法 屬性和靜態域的類時,而在缺少顯示的構造器的時候,編譯器會提供乙個無參的預設構造器,由於例項化它們並沒有任何意義,所以顯然沒有必要,這時候我們可以提供乙個私有的構造器,這樣就不被例項化了,當然,我們最後在構造器中丟擲異常來進行說明下,或者加條注釋。public clas...
第4條 通過私有方法強化不可例項化的能力
有時候,會需要編寫一些只含有靜態域和靜態方法的類。例如工具類 utility class 這些類不需要被例項化,也不需要被繼承。因為例項化對他們並沒有什麼卵用。然而,在缺少顯式構造器的時候,編譯器會自動提供以個公有的無參的預設構造器。這樣,這個工具類和別的類就沒有區別了 可以例項化,可以被類繼承 為...