關于Java中常量的話題似乎有很多困惑。有些人使用整數(shù)或字符串來定義常量,而另一些人則使用枚舉。
我還遇到了在它們自己的接口中定義的常量——在接口中,使用常量的類必須實現(xiàn)接口。這種策略通常被稱為接口常量設計模式。
在本文中,我們將了解在Java中存儲常量的兩種最常見的策略:整數(shù)和枚舉。
首先也是最重要的,當你決定使用常量時,你應該非常確定常量不會隨著時間而改變,這樣你就可以避免重新編譯。
在這篇文章中,我們將使用一個非常常見的常量候選——工作日!
假設我們有一個表示在線商店中訂單的類,我們希望在其中跟蹤訂單發(fā)生在一周中的哪一天。
看起來是這樣的:
請注意,該類暫時不會編譯-[數(shù)據(jù)類型]只是我們將使用的常量類型的占位符。
用整數(shù)定義常數(shù)
在Java中,定義常量最常用的方法之一是通過整數(shù),其中整數(shù)變量是靜態(tài)的。
定義整數(shù)常量時要問的第一個問題是將它們放置在何處。我們是否將它們直接放在班級中?還是給他們上課?
由于days非常通用,而且不一定只連接到Order類型的對象,因此我們將在它們自己的類WeekDay中定義它們。
你可能注意到了私有構造函數(shù)——這是為了避免客戶端實例化類。該類只保存靜態(tài)變量,這些變量沒有綁定到對象,因此不需要實例化該類。
現(xiàn)在,每當我們需要為訂單設定一個特定的日期時,我們都會這樣做:
當我們想檢查訂單是否發(fā)生在星期五時,我們可以簡單地調用write:
到目前為止,還不錯。這個設計肯定不會有什么問題吧?
假設你一年后會回到這個代碼,你必須檢查下訂單是否在周一發(fā)生。
在這種情況下,可以嘗試以下方法:
在那一刻,完全忘記了WeekDay類,這段代碼非常有意義。星期一是一周的第一天,所以工作日應該是1,對吧?
但不是,因為靜態(tài)in t變量Monday在我們的WeekDay類中定義為0!
這是一個很好的例子,說明了為什么應該考慮避免使用整數(shù)常量。它們容易出錯和混淆,并且很難調試。
用枚舉定義常量
在Java中定義常量的另一種方法是使用枚舉。
當使用枚舉時,常量類將如下所示:
注意,沒有私有構造函數(shù)-不需要程序員(你?。娭圃擃愂遣豢蓪嵗?,因為枚舉在默認情況下是不可實例化的!
將工作日設置為順序的語法與整型常量的語法完全相同:
我們如何在星期五處理訂單也沒有什么不同:
關鍵的區(qū)別在于,這是在Order類中設置和比較weekday變量值的唯一方法。
order.setWeekDay(1);和if(order.getWeekDay()==1)都會使編譯器拋出一個錯誤,因為試圖使用integerDay類型的變量,而它們應該是WeekDay類型。
回想一下你完全忘記了的情景。
對于枚舉,這不再是一個問題。如果嘗試使用整數(shù)而不是工作日枚舉的成員,編譯器只會拋出一個錯誤,告訴您需要使用工作日枚舉。
換言之,唯一能檢查訂單是否在星期五發(fā)生的是:
就如上面這樣,再清楚不過了。
不再被迫記住constants類,如果有任何客戶機要使用您的代碼,他們不必懷疑Monday實際上是由0還是1表示的。
我希望這個例子向您展示了為什么在定義常量時應該考慮在整數(shù)上使用枚舉。
枚舉將使你的代碼不易出錯、更易于閱讀和維護。
-
接口
+關注
關注
33文章
8906瀏覽量
153077 -
JAVA
+關注
關注
20文章
2984瀏覽量
106691
發(fā)布評論請先 登錄
基于ISOS測試標準,兩種封裝方式對鈣鈦礦太陽能電池性能影響分析

AMC1204有兩種封裝,SOIC-8和SOIC-16,功能一樣嗎?為什么要推出兩種封裝?
芯片制造過程中的兩種刻蝕方法

Java 枚舉與策略模式、函數(shù)式接口的結合:實現(xiàn)高內聚低耦合的設計
OPA277為何有Specified Voltage Range和Operating Voltage Range兩種定義?
兩種常見的硬件消抖實現(xiàn)方式

晶閘管的阻斷狀態(tài)有兩種是什么
wdm設備的兩種傳輸方式
三相負載的連接方式有哪兩種
華納云:java web和java有什么區(qū)別java web和java有什么區(qū)別

評論