java 中常量的定義方式。
問題描述
public class EnumDome { public static final String SUCCESS = 'Y'; public static final String FAIL = 'N'; enum State{SUCCESS('Y'),FAIL('N');private final String state;State(String state){ this.state = state;}public String getState(){ return state;} }}
這兩種定義常量的方式各有什么特點?在使用過程中更推薦使用何種方式?
問題解答
回答1:這個問題,從語法層面上來說,沒有什么懸念。百度一下常量和枚舉的區別就好了。
但是從設計角度上來說,'enum' 要優于 'static final' 的。
這么說可能比較抽象,我舉個例子:比如我定義了一個公有函數(更準確的說是公有方法)叫 setResponseState
一種是這樣定義的:setResponseState(String state) { ... },使用字符串作參數。
一種是這樣定義的:setResponseState(EnumDemo.State state) { ... },使用枚舉作參數。
對于第一種定義,正確的調用方式是:setResponseState(EnumDemo.SUCCESS);
但是如果這么調用:setResponseState('abcd'); 是不是在 JAVA 語言的語法上也沒有問題呢?
編譯器走到這里還是可以通過的……但在運行期可能會導致嚴重的錯誤,降低系統的可靠性。
這里的最大問題就是 '函數參數不夠明確',這會給使用這個方法的開發人員造成困擾。他不得不去回查我的源碼,才能最終確定到底要傳一個什么樣的參數給我……
而再假如,這個函數(方法)被我封裝到一套框架代碼中,不提供源碼,那么開發人員回查起來就更困難了。這會降低開發效率。
而使用 setResponseState(EnumDemo.State state) { ... } 這樣的定義方式,是非常明確的。要么是 SUCCESS,要么是 FAIL,再要么是 null。
開發人員調用這個函數(方法)幾乎不會出錯,也根本無需回查源碼。
所以比較嚴謹的做法是使用枚舉。當然這是在定義公共函數(方法)的時候。
而如果 setResponseState 是一個私有函數(方法),那么可以稍微隨意一些,使用字符串參數也是可以的。必定這種 '不嚴謹' 只暴露給內部。
形象一點的,就是對外我們要顯得非常專業,而對內,可以稍微降低一下標準。
這是常量和枚舉的兩個不同應用場景,希望對你有所幫助……
回答2:簡單的說:只有 static final 是定義常量的方法。 后面那個不是,不過功能上是相似的。具體用那個還是取決于你的需求
深入地說:貼地址:
Java 語言中 Enum 類型的使用介紹Java枚舉類型(enum)簡介
相關文章:
1. 我的html頁面一提交,網頁便顯示出了我的php代碼,求問是什么原因?2. java 排序的問題3. tp6表單令牌4. angular.js - Angular路由和express路由的組合使用問題5. docker 17.03 怎么配置 registry mirror ?6. node.js - node 客戶端socket一直報錯Error: read ECONNRESET,用php的socket沒問題哈。。7. 網絡傳輸協議 - 以下三種下載方式有什么不同?如何用python模擬下載器下載?8. 我在centos容器里安裝docker,也就是在容器里安裝容器,報錯了?9. 數據庫 - 使用讀寫分離后, MySQL主從復制延遲會導致讀不到數據嗎?10. django - 后臺返回的json數據經過Base64加密,獲取時用python如何解密~!
