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

初學 Java 的人很不經意間就會把常量定義在接口中,大概惟一的理由是接口不能實例化,而使用接口中定義的常量也是不用附着在實例上的。這主要仍是 JDK 自己給咱們作了不少這樣的榜樣, 如  java.io.ObjectStreamConstans,可能是出如今 Enum 類型到來以前。html

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

1. 接口是不能阻止被實現或繼承的,也就是說子接口或實現中是可以覆蓋掉常量的定義,這樣經過父,子接口(或實現) 去引用常量是可能不一致的
2. 一樣的,因爲被實現或繼承,形成在繼承樹中能夠用大量的接口, 類 或實例去引用 同一個常量,從而形成接口中定義的常量污染了命名空間。(Java 編譯器居然容許使用實例去引用類變量)
3. 接口暗含的意思是:它是需被實現的,表明着一種類型,它的公有成員是要被暴露的 API。而在接口中定義的常量說不上是 APIapi

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

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

閱讀全文
.net

相關文章
相關標籤/搜索