Effective Java學習筆記之四:通過私有構造器實現不可實例化

  • 解釋

有時候,我們想寫一個只包含靜態方法和靜態字段的類,這樣的工具類不希望被實例化,因為實例化對它沒有任何意義。然而,在缺少顯式構造器的情況下,編譯器會自動提供一個公有的、無參的缺省構造器,為了避免這種情況,讓這個類包含一個私有構造器,它就不能被實例化:

//不可實例化工具類
public class Rule4 {
//禁止默認構造函數以實現不可實例化
private Rule4() {
//避免不小心在類的內部調用構造器
throw new AssertionError();
}
}
  • 優點1:簡單

嘗試通過抽象類來強制執行非實例化不起作用。 該類可以是子類,子類可以實例化。這樣做甚至會誤導用戶,以為這種類是專門為了繼承而設計的。

  • 缺點1:不能被繼承

它使得一個類不能被子類化,因為子類必須顯式或隱式地調用超類構造器。

  • 最佳實踐

使用Spring框架時,工具類也不建議通過Spring進行注入,所以,這種規則還是很有意義的,推薦使用,通常工具類我們會用final修飾類,這是為了保證類的數據的不可變,所以一個完善的工具類應該如下定義:

public final class Rule4 {
//禁止默認構造函數以實現不可實例化
private Rule4() {
//避免不小心在類的內部調用構造器
throw new AssertionError();
}
}

Java8提供了在接口類中定義靜態類的方法,同樣不可實例化,而且,接口類中的成員變量都是final的,實現更加簡潔:

public interface Rule41 {
public static void test() {
System.out.println("Rule41.test...");
}
}

在Java8以後,建議都通過interface寫工具類。

Effective Java學習筆記之四:通過私有構造器實現不可實例化

專業從事軟件研發工作多年,在軟件設計、開發、測試、研發管理等領域裡經驗豐富,感興趣的朋友可以關注我的頭條號,相信一定會有所收穫。

如果有軟件研發方面的問題,可以諮詢我。

謝謝!


分享到:


相關文章: