更新時間:2022-04-01 10:24:20 來源:動力節(jié)點(diǎn) 瀏覽1699次
圍繞Java常量這個話題似乎有很多困惑。有些人使用整數(shù)或字符串來定義常量,而另一些人則使用枚舉。
在本文中,我們將了解在 Java 中存儲常量的兩種最常見的策略: 整數(shù)和枚舉。
首先,當(dāng)您決定使用常量時,您應(yīng)該非常確定常量不會隨著時間而改變,這樣您就可以避免重新編譯。
在本文中,我們將使用一個非常常見的常量候選者——工作日!
假設(shè)我們有一個類表示在線商店中的訂單,我們希望在其中跟蹤訂單發(fā)生在一周中的哪一天。
我們的類看起來像這樣:
公共 類 訂單{
私人[數(shù)據(jù)類型] weekDay ;
公共[數(shù)據(jù)類型] getWeekDay () {
返回 工作日;
}
公共 無效 setWeekDay ([數(shù)據(jù)類型] weekDay ) {
這個。星期天 = 星期天;
}
}
請注意,該類暫時不會編譯 - [datatype] 只是我們將使用的常量類型的占位符。
在 Java 中定義常量的最常見方法之一是通過整數(shù),其中整數(shù)變量是靜態(tài)的。
公共 靜態(tài) int 星期一 = 0 ;
公共 靜態(tài) int 星期二 = 1 ;
公共 靜態(tài) int 星期三 = 2 ;
公共 靜態(tài) int 星期四 = 3 ;
公共 靜態(tài) int FRIDAY = 4 ;
公共 靜態(tài) int 星期六 = 5 ;
公共 靜態(tài) int SUNDAY = 6 ;
定義整數(shù)常量時要問的第一個問題是放置它們的位置。我們是否將它們直接放在課堂上?還是我們給他們自己的課? Order
由于日子非常普遍,而且不一定只與 type 的對象相關(guān) Order,我們將在它們自己的 class 中定義它們。 WeekDay
公共 課 工作日{(diào)
私人 工作日(){}
??? 公共 靜態(tài) int 星期一 = 0 ;
公共 靜態(tài) int 星期二 = 1 ;
公共 靜態(tài) int 星期三 = 2 ;
公共 靜態(tài) int 星期四 = 3 ;
公共 靜態(tài) int FRIDAY = 4 ;
公共 靜態(tài) int 星期六 = 5 ;
公共 靜態(tài) int SUNDAY = 6 ;
}
您可能注意到了私有構(gòu)造函數(shù)——這是為了避免客戶端實例化該類。該類僅包含與對象無關(guān)的靜態(tài)變量,因此無需實例化該類。
現(xiàn)在,每當(dāng)我們需要為訂單設(shè)置特定日期時,我們都會這樣做:
訂單 order = new Order ();
訂購。setWeekDay ( WeekDay . MONDAY );
而當(dāng)我們想檢查訂單是否發(fā)生在星期五時,我們可以簡單地調(diào)用 write:
if(order.getWeekDay() == WeekDay.FRIDAY)
到目前為止,一切都很好。這樣的設(shè)計肯定不會有問題吧?
好吧,讓我們假設(shè)您在一年后回到此代碼 - 您必須檢查訂單是否發(fā)生在星期一。
哦,當(dāng)然——你已經(jīng)完全忘記了 WeekDay 課程......
在這種情況下,你可以嘗試這樣的事情:
if(order.getWeekDay() == 1)
在那一刻,完全忘記了 WeekDay 類,這段代碼非常有意義。星期一是一周的第一天,所以工作日應(yīng)該是 1,對吧?
但是不,不是,因為靜態(tài) int 變量 Monday在我們的 類中被定義為0WeekDay !
這是一個很好的例子,說明了為什么您應(yīng)該考慮避免 使用整數(shù)常量。它們?nèi)菀壮鲥e、令人困惑且難以調(diào)試。
在 Java 中定義常量的另一種方法是使用enums。
使用枚舉時,我們的常量類將如下所示:
公共 枚舉 WeekDay {
星期一,
星期二,
星期三,
星期四,
星期五,
星期六,
星期日
}
注意沒有私有構(gòu)造函數(shù)——程序員(你!)不需要強(qiáng)制類是不可實例化的,因為默認(rèn)情況下枚舉是不可實例化的!
將 a 設(shè)置為順序的語法 WeekDay 與整數(shù)常量完全相同:
order.setWeekDay(WeekDay.MONDAY);
我們?nèi)绾翁幚碛唵问欠裨谛瞧谖逄幚硪矝]有區(qū)別:
if(order.getWeekDay() == WeekDay.FRIDAY)
但是,主要區(qū)別在于這是您可以設(shè)置和比較 Order 類中 weekday 變量值的唯一方法。
兩者 order.setWeekDay(1); 和 if(order.getWeekDay() == 1) 都會使編譯器拋出一個錯誤,因為你試圖使用整數(shù)類型的變量,而它們應(yīng)該是! WeekDay
使用Java枚舉,這不再是問題。如果您嘗試使用整數(shù)而不是 WeekDay 枚舉成員,編譯器將簡單地拋出一個錯誤,告訴您需要使用 WeekDay 枚舉。
換句話說,唯一能幫助您檢查訂單是否發(fā)生在星期五的是:
if(order.getWeekDay == WeekDay.FRIDAY)
沒有比這更清楚的了!
您不再需要記住常量類,并且如果有任何客戶使用您的代碼,他們不必懷疑星期一實際上是由 0 還是 1 表示的。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743