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è)方法的開(kāi)發(fā)人員造成困擾。他不得不去回查我的源碼,才能最終確定到底要傳一個(gè)什么樣的參數(shù)給我……
而再假如,這個(gè)函數(shù)(方法)被我封裝到一套框架代碼中,不提供源碼,那么開(kāi)發(fā)人員回查起來(lái)就更困難了。這會(huì)降低開(kāi)發(fā)效率。
而使用 setResponseState(EnumDemo.State state) { ... } 這樣的定義方式,是非常明確的。要么是 SUCCESS,要么是 FAIL,再要么是 null。
開(kāi)發(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. android - 使用百度sdk調(diào)用SDKInitializer.initialize(this)時(shí)報(bào)錯(cuò)?2. javascript - 最近用echarts做統(tǒng)計(jì)圖時(shí)遇到兩個(gè)問(wèn)題!!3. 淺談Vue使用Cascader級(jí)聯(lián)選擇器數(shù)據(jù)回顯中的坑4. html5 - 用h5本地存儲(chǔ)是否安全?5. 基于Spring MVC Java的配置無(wú)法正常工作控制臺(tái)顯示無(wú)錯(cuò)誤,但我的jsp頁(yè)面未顯示6. javascript - webpack-dev-server和webpack沖突嗎7. javascript - react熱加載的一段代碼8. android - 優(yōu)酷的安卓及蘋果app還在使用flash技術(shù)嗎?9. 微信公眾號(hào)在線生成二維碼帶參數(shù)怎么搞?10. myeclipse中修改了javaweb的web.xml文件,為什么有時(shí)候會(huì)自動(dòng)重新部署生效,有時(shí)就不會(huì)自動(dòng)呢?

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