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;} }}
這兩種定義常量的方式各有什么特點(diǎn)?在使用過程中更推薦使用何種方式?
問題解答
回答1:這個(gè)問題,從語法層面上來說,沒有什么懸念。百度一下常量和枚舉的區(qū)別就好了。
但是從設(shè)計(jì)角度上來說,'enum' 要優(yōu)于 'static final' 的。
這么說可能比較抽象,我舉個(gè)例子:比如我定義了一個(gè)公有函數(shù)(更準(zhǔn)確的說是公有方法)叫 setResponseState
一種是這樣定義的:setResponseState(String state) { ... },使用字符串作參數(shù)。
一種是這樣定義的:setResponseState(EnumDemo.State state) { ... },使用枚舉作參數(shù)。
對(duì)于第一種定義,正確的調(diào)用方式是:setResponseState(EnumDemo.SUCCESS);
但是如果這么調(diào)用:setResponseState('abcd'); 是不是在 JAVA 語言的語法上也沒有問題呢?
編譯器走到這里還是可以通過的……但在運(yùn)行期可能會(huì)導(dǎo)致嚴(yán)重的錯(cuò)誤,降低系統(tǒng)的可靠性。
這里的最大問題就是 '函數(shù)參數(shù)不夠明確',這會(huì)給使用這個(gè)方法的開發(fā)人員造成困擾。他不得不去回查我的源碼,才能最終確定到底要傳一個(gè)什么樣的參數(shù)給我……
而再假如,這個(gè)函數(shù)(方法)被我封裝到一套框架代碼中,不提供源碼,那么開發(fā)人員回查起來就更困難了。這會(huì)降低開發(fā)效率。
而使用 setResponseState(EnumDemo.State state) { ... } 這樣的定義方式,是非常明確的。要么是 SUCCESS,要么是 FAIL,再要么是 null。
開發(fā)人員調(diào)用這個(gè)函數(shù)(方法)幾乎不會(huì)出錯(cuò),也根本無需回查源碼。
所以比較嚴(yán)謹(jǐn)?shù)淖龇ㄊ鞘褂妹杜e。當(dāng)然這是在定義公共函數(shù)(方法)的時(shí)候。
而如果 setResponseState 是一個(gè)私有函數(shù)(方法),那么可以稍微隨意一些,使用字符串參數(shù)也是可以的。必定這種 '不嚴(yán)謹(jǐn)' 只暴露給內(nèi)部。
形象一點(diǎn)的,就是對(duì)外我們要顯得非常專業(yè),而對(duì)內(nèi),可以稍微降低一下標(biāo)準(zhǔn)。
這是常量和枚舉的兩個(gè)不同應(yīng)用場(chǎng)景,希望對(duì)你有所幫助……
回答2:簡(jiǎn)單的說:只有 static final 是定義常量的方法。 后面那個(gè)不是,不過功能上是相似的。具體用那個(gè)還是取決于你的需求
深入地說:貼地址:
Java 語言中 Enum 類型的使用介紹Java枚舉類型(enum)簡(jiǎn)介
相關(guān)文章:
1. javascript - ie11以下單擊打開不了file,雙擊可以。求解?2. javascript - 關(guān)于定時(shí)器 與 防止連續(xù)點(diǎn)擊 問題3. javascript - 關(guān)于這組數(shù)據(jù)如何實(shí)現(xiàn) 按字母列表分類展示 不改動(dòng)數(shù)據(jù)結(jié)構(gòu)4. javascript - 寫移動(dòng)端的頁(yè)面的時(shí)候,有不一快空白,是怎么回事?5. javascript - 求助這種功能有什么好點(diǎn)的插件?6. objective-c - ios百度地圖定位問題7. 微信開放平臺(tái) - Android調(diào)用微信分享不顯示8. html5 - rudy編譯sass的時(shí)候有中文報(bào)錯(cuò)9. javascript - 在IE中(9+)平時(shí)的樣式不生效,只有用開發(fā)者工具選中這個(gè)元素才生效,是什么原因?10. Python做掃描,發(fā)包速度實(shí)在是太慢了,有優(yōu)化的方案嗎?
