1. 程式人生 > >Java 接口常量反模式及如何定義 Java 常量

Java 接口常量反模式及如何定義 Java 常量

constant

初學 Java 的人很不經意間就會把常量定義在接口中,大概唯一的理由是接口不能實例化,而使用接口中定義的常量也是不用附著在實例上的。這主要還是 JDK 本身給我們做了很多這樣的榜樣, 如 java.io.ObjectStreamConstans,多是出現在 Enum 類型到來之前。

其實 Java 的接口常量是一種反模式,理由如下:

1. 接口是不能阻止被實現或繼承的,也就是說子接口或實現中是能夠覆蓋掉常量的定義,這樣通過父,子接口(或實現) 去引用常量是可能不一致的
2. 同樣的,由於被實現或繼承,造成在繼承樹中可以用大量的接口, 類 或實例去引用 同一個常量,從而造成接口中定義的常量汙染了命名空間。(Java 編譯器竟然允許使用實例去引用類變量)

3. 接口暗含的意思是:它是需被實現的,代表著一種類型,它的公有成員是要被暴露的 API。而在接口中定義的常量說不上是 API

參見: Effective java 第 19 條: 接口只用於定義類型

既然接口中不適於定義常量,那麽該在何處為常量安家呢?接口為 實現/繼承 而生,如果放在類中,並且這個類是 final,且封閉掉構造方法就行。於是我們先前的接口常量定義

閱讀全文


Java 接口常量反模式及如何定義 Java 常量