java 中常量的定義方式。
問(wèn)題描述
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)?在使用過(guò)程中更推薦使用何種方式?
問(wèn)題解答
回答1:這個(gè)問(wèn)題,從語(yǔ)法層面上來(lái)說(shuō),沒(méi)有什么懸念。百度一下常量和枚舉的區(qū)別就好了。
但是從設(shè)計(jì)角度上來(lái)說(shuō),'enum' 要優(yōu)于 'static final' 的。
這么說(shuō)可能比較抽象,我舉個(gè)例子:比如我定義了一個(gè)公有函數(shù)(更準(zhǔn)確的說(shuō)是公有方法)叫 setResponseState
一種是這樣定義的:setResponseState(String state) { ... },使用字符串作參數(shù)。
一種是這樣定義的:setResponseState(EnumDemo.State state) { ... },使用枚舉作參數(shù)。
對(duì)于第一種定義,正確的調(diào)用方式是:setResponseState(EnumDemo.SUCCESS);
但是如果這么調(diào)用:setResponseState('abcd'); 是不是在 JAVA 語(yǔ)言的語(yǔ)法上也沒(méi)有問(wèn)題呢?
編譯器走到這里還是可以通過(guò)的……但在運(yùn)行期可能會(huì)導(dǎo)致嚴(yán)重的錯(cuò)誤,降低系統(tǒng)的可靠性。
這里的最大問(wèn)題就是 '函數(shù)參數(shù)不夠明確',這會(huì)給使用這個(gè)方法的開發(fā)人員造成困擾。他不得不去回查我的源碼,才能最終確定到底要傳一個(gè)什么樣的參數(shù)給我……
而再假如,這個(gè)函數(shù)(方法)被我封裝到一套框架代碼中,不提供源碼,那么開發(fā)人員回查起來(lái)就更困難了。這會(huì)降低開發(fā)效率。
而使用 setResponseState(EnumDemo.State state) { ... } 這樣的定義方式,是非常明確的。要么是 SUCCESS,要么是 FAIL,再要么是 null。
開發(fā)人員調(diào)用這個(gè)函數(shù)(方法)幾乎不會(huì)出錯(cuò),也根本無(wú)需回查源碼。
所以比較嚴(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)單的說(shuō):只有 static final 是定義常量的方法。 后面那個(gè)不是,不過(guò)功能上是相似的。具體用那個(gè)還是取決于你的需求
深入地說(shuō):貼地址:
Java 語(yǔ)言中 Enum 類型的使用介紹Java枚舉類型(enum)簡(jiǎn)介
相關(guān)文章:
1. 我在centos容器里安裝docker,也就是在容器里安裝容器,報(bào)錯(cuò)了?2. docker不顯示端口映射呢?3. docker-compose中volumes的問(wèn)題4. 在windows下安裝docker Toolbox 啟動(dòng)Docker Quickstart Terminal 失敗!5. docker內(nèi)創(chuàng)建jenkins訪問(wèn)另一個(gè)容器下的服務(wù)器問(wèn)題6. golang - 用IDE看docker源碼時(shí)的小問(wèn)題7. javascript - 連續(xù)點(diǎn)擊觸發(fā)mouseleave事件8. 關(guān)docker hub上有些鏡像的tag被標(biāo)記““This image has vulnerabilities””9. docker容器呢SSH為什么連不通呢?10. mac里的docker如何命令行開啟呢?

網(wǎng)公網(wǎng)安備