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