關(guān)于Java中常量的話題似乎有很多困惑。有些人使用整數(shù)或字符串來定義常量,而另一些人則使用枚舉。
我還遇到了在它們自己的接口中定義的常量——在接口中,使用常量的類必須實(shí)現(xiàn)接口。這種策略通常被稱為接口常量設(shè)計(jì)模式。
在本文中,我們將了解在Java中存儲常量的兩種最常見的策略:整數(shù)和枚舉。
首先也是最重要的,當(dāng)你決定使用常量時,你應(yīng)該非常確定常量不會隨著時間而改變,這樣你就可以避免重新編譯。
在這篇文章中,我們將使用一個非常常見的常量候選——工作日!
假設(shè)我們有一個表示在線商店中訂單的類,我們希望在其中跟蹤訂單發(fā)生在一周中的哪一天。
看起來是這樣的:
請注意,該類暫時不會編譯-[數(shù)據(jù)類型]只是我們將使用的常量類型的占位符。
用整數(shù)定義常數(shù)
在Java中,定義常量最常用的方法之一是通過整數(shù),其中整數(shù)變量是靜態(tài)的。
定義整數(shù)常量時要問的第一個問題是將它們放置在何處。我們是否將它們直接放在班級中?還是給他們上課?
由于days非常通用,而且不一定只連接到Order類型的對象,因此我們將在它們自己的類WeekDay中定義它們。
你可能注意到了私有構(gòu)造函數(shù)——這是為了避免客戶端實(shí)例化類。該類只保存靜態(tài)變量,這些變量沒有綁定到對象,因此不需要實(shí)例化該類。
現(xiàn)在,每當(dāng)我們需要為訂單設(shè)定一個特定的日期時,我們都會這樣做:
當(dāng)我們想檢查訂單是否發(fā)生在星期五時,我們可以簡單地調(diào)用write:
到目前為止,還不錯。這個設(shè)計(jì)肯定不會有什么問題吧?
假設(shè)你一年后會回到這個代碼,你必須檢查下訂單是否在周一發(fā)生。
在這種情況下,可以嘗試以下方法:
在那一刻,完全忘記了WeekDay類,這段代碼非常有意義。星期一是一周的第一天,所以工作日應(yīng)該是1,對吧?
但不是,因?yàn)殪o態(tài)in t變量Monday在我們的WeekDay類中定義為0!
這是一個很好的例子,說明了為什么應(yīng)該考慮避免使用整數(shù)常量。它們?nèi)菀壮鲥e和混淆,并且很難調(diào)試。
用枚舉定義常量
在Java中定義常量的另一種方法是使用枚舉。
當(dāng)使用枚舉時,常量類將如下所示:
注意,沒有私有構(gòu)造函數(shù)-不需要程序員(你!)強(qiáng)制該類是不可實(shí)例化的,因?yàn)槊杜e在默認(rèn)情況下是不可實(shí)例化的!
將工作日設(shè)置為順序的語法與整型常量的語法完全相同:
我們?nèi)绾卧谛瞧谖逄幚碛唵我矝]有什么不同:
關(guān)鍵的區(qū)別在于,這是在Order類中設(shè)置和比較weekday變量值的唯一方法。
order.setWeekDay(1);和if(order.getWeekDay()==1)都會使編譯器拋出一個錯誤,因?yàn)樵噲D使用integerDay類型的變量,而它們應(yīng)該是WeekDay類型。
回想一下你完全忘記了的情景。
對于枚舉,這不再是一個問題。如果嘗試使用整數(shù)而不是工作日枚舉的成員,編譯器只會拋出一個錯誤,告訴您需要使用工作日枚舉。
換言之,唯一能檢查訂單是否在星期五發(fā)生的是:
就如上面這樣,再清楚不過了。
不再被迫記住constants類,如果有任何客戶機(jī)要使用您的代碼,他們不必懷疑Monday實(shí)際上是由0還是1表示的。
我希望這個例子向您展示了為什么在定義常量時應(yīng)該考慮在整數(shù)上使用枚舉。
枚舉將使你的代碼不易出錯、更易于閱讀和維護(hù)。
-
接口
+關(guān)注
關(guān)注
33文章
8691瀏覽量
151915 -
JAVA
+關(guān)注
關(guān)注
19文章
2974瀏覽量
105139
發(fā)布評論請先 登錄
相關(guān)推薦
基于ISOS測試標(biāo)準(zhǔn),兩種封裝方式對鈣鈦礦太陽能電池性能影響分析
![基于ISOS測試標(biāo)準(zhǔn),<b class='flag-5'>兩種</b>封裝方式對鈣鈦礦太陽能電池性能影響分析](https://file1.elecfans.com/web2/M00/90/B6/wKgaomTcZGeAJZInAAAfzRiM67Q313.png)
芯片制造過程中的兩種刻蝕方法
![芯片制造過程<b class='flag-5'>中</b>的<b class='flag-5'>兩種</b>刻蝕方法](https://file1.elecfans.com/web3/M00/01/4A/wKgZPGdSbPeAEpHfAABN6etD8AQ974.png)
Java 枚舉與策略模式、函數(shù)式接口的結(jié)合:實(shí)現(xiàn)高內(nèi)聚低耦合的設(shè)計(jì)
OPA277為何有Specified Voltage Range和Operating Voltage Range兩種定義?
兩種常見的硬件消抖實(shí)現(xiàn)方式
![<b class='flag-5'>兩種</b><b class='flag-5'>常見</b>的硬件消抖實(shí)現(xiàn)方式](https://file1.elecfans.com/web2/M00/08/DE/wKgaombzzvmAN4ncAAD90rLdkv4452.png)
晶閘管的阻斷狀態(tài)有兩種是什么
wdm設(shè)備的兩種傳輸方式
三相負(fù)載的連接方式有哪兩種
華納云:java web和java有什么區(qū)別java web和java有什么區(qū)別
![華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別](https://file1.elecfans.com/web2/M00/FD/AC/wKgaomaWBouAMAnAAAAglmvluP4293.png)
評論