java - enum是什么? 為什么有它? 怎么用?
問(wèn)題描述
實(shí)際現(xiàn)象enum的基本會(huì)用, 但想追本溯源( 探討下本質(zhì) )
預(yù)期現(xiàn)象拒絕教條式的摘抄文檔式的回答(時(shí)間重要)
求對(duì)enum深刻的認(rèn)識(shí)(至少在實(shí)際生產(chǎn)環(huán)境中寫(xiě)過(guò)很多代碼) !
注: 我不是編程初學(xué)者, 一些初級(jí)概念無(wú)需科普
上下文環(huán)境討論的對(duì)象, 為Java中的enum( 其實(shí)enum是一種概念 )
具體地, 是討論enum 這個(gè)關(guān)鍵字
問(wèn)題解答
回答1:可以用來(lái)代替定義類型常量 ,比如 訂單狀態(tài),證件類型等,保證類型安全 比如用普通的String類表示訂單狀態(tài),調(diào)用方可以傳一個(gè)不在訂單狀態(tài)范圍內(nèi)的String給被調(diào)用方,這種錯(cuò)誤在編譯階段不能發(fā)現(xiàn)
java枚舉類本質(zhì)是一個(gè)多例模式實(shí)現(xiàn),單例模式是多例模式的一個(gè)特例
枚舉類不能繼承,比如enumA extends enumB不行
一個(gè)枚舉類 內(nèi)部類型有順序(order) 實(shí)現(xiàn)了 Comparable接口
回答2:Effective Java 第6章有詳細(xì)的解釋,可以去看看
回答3:可以簡(jiǎn)單把enum看成一個(gè)有備注信息的int類型。
回答4:被你的條件嚇到了,我就說(shuō)一點(diǎn)我個(gè)人的想法
enum可以看做一種特殊的class,包含一些訪問(wèn)性公開(kāi)的常量,其實(shí)作為訪問(wèn)性公開(kāi)的常量來(lái)說(shuō),在類加載過(guò)程中已經(jīng)被解析到常量池,enum只是從語(yǔ)義的角度使用戶可以更方便地在使用常量時(shí)展示常量的含義。同時(shí)也方便了常量的構(gòu)造,循環(huán)遍歷某一類型的所有常量,在switch語(yǔ)句中使用等等。
回答5:這個(gè)題目太泛,不太好回答。enum本質(zhì)上是一個(gè)繼承了java.lang.Enum的class,可以用在單例和需要限定輸入的地方
回答6:先說(shuō)說(shuō)自己個(gè)人的膚淺的主觀的理解, 拋磚引玉.
我覺(jué)得 enum 出現(xiàn)的目的是:
提供一種管理常量的手段,
一種命名空間.
回答7:enum的存在本身就是為了解決常量的可讀性的問(wèn)題,在沒(méi)有enum之前,標(biāo)記一種狀態(tài),常使用int類型,其1,2之類的可讀性不是很好,而且新增一個(gè)常量要寫(xiě)一個(gè)長(zhǎng)長(zhǎng)語(yǔ)句,為了解決這一系列問(wèn)題在jdk5就加上了這個(gè)功能。其本質(zhì)就是一個(gè)類,只不過(guò)在創(chuàng)建enum的時(shí)候,會(huì)自動(dòng)生成values()、ordinal()等方法,并且支持了switch語(yǔ)句,覆蓋了常量會(huì)出現(xiàn)的場(chǎng)景,比直接定義常量要方便使用。
相關(guān)文章:
1. 安全性測(cè)試 - nodejs中如何防m(xù)ySQL注入2. javascript - 關(guān)于apply()與call()的問(wèn)題3. html - eclipse 標(biāo)簽錯(cuò)誤4. python 利用subprocess庫(kù)調(diào)用mplayer時(shí)發(fā)生錯(cuò)誤5. python - Pycharm的Debug用不了6. datetime - Python如何獲取當(dāng)前時(shí)間7. 請(qǐng)問(wèn)PHPstudy中的數(shù)據(jù)庫(kù)如何創(chuàng)建索引8. python - pycharm 自動(dòng)刪除行尾空格9. python文檔怎么查看?10. javascript - nginx反向代理靜態(tài)資源403錯(cuò)誤?
