Effective Java Item 4 note

Enforce noninstantiability with a private constructor

Arwii
mycodingjourney
2 min readMay 23, 2018

--

有時候可能需要一些class只有static method或static field,像是java.lang.Math,等等的utility的class

在Java中如果在class裡面沒有寫constructor的話,編譯器會幫你補上一個public及沒有參數的constructor,而在上述這種只有static method或static field的utility class中,帶有個意義是不希望被實例化,所以為了避免編譯器幫補上constructor,必須加上一個private的constructor類似下面這樣:

public class test {
private test() {
throw new AssertionError();
}
}

private可以避免外面的class去實例化它,而在constructor裡面還是要加上execption則是為了避免在class裡面有人去實例化這個class.

Java中也有種方式可以阻止class實例化,就是把class宣告成abstract,但這個以設計理念來說相當不建議這樣使用,因為abstract是用來繼承考量的寫法,如果這樣使用會誤導其他人,以為這個class是可以繼承的.

不過這樣使用也有個缺點就是這類的class就完全沒辦法繼承了.

另外,如果明確的不想讓人繼承,可以在class前面加上final

public final class test {
private test() {
throw new AssertionError();
}
}

然後有點好奇除了設計裡念之外有什麼別的因素會想要使用這樣的寫法呢?

查了一下這種寫法沒有什麼缺點,比較有衝突的大概是跟OO的概念比較有相關.但java自己本身也這樣用了,應該也是還好.只要使用時機是,沒有state,然後跟utility有相關,就可以寫成這類的class

Ref: https://stackoverflow.com/questions/31409982/java-best-practice-class-with-only-static-methods

--

--

Arwii
mycodingjourney

Try not to become a man of success, but rather try to become a man of value — A. Einstein