圍繞JAVA中的常量主題似乎存在很多混淆,有的人使用整數或字符串來定義常量,而有的人則使用枚舉。
我還遇到了在自己的接口中定義的常量 —— 使用常量的類必須實現接口。該策略通常被稱為界面常量設計模式。
在本文中,我們將介紹在Java中存儲常量的兩種最常見的策略: 整數和枚舉。
假設我們有一個表示在線商店中的訂單的類,我們希望跟蹤訂單發生的一周中的哪一天。
請注意,該類目前不會編譯 - [datatype]只是我們將使用的常量類型的占位符。
用整數定義常量
在Java中定義常量的最常用方法之一是通過整數,其中整數變量是靜態的。
定義整數常量時要注意的第一個問題是放置它們的位置。我們是直接將它們直接放在Order類中?還是給他們自己的Class呢?
由于days非常普遍,而且不一定只連接到Order類型的對象,所以我們將在它們自己的類WeekDay中定義它們。
您可能注意到了私有構造函數——這是為了避免客戶機實例化類。該類只包含靜態變量,這些變量不綁定到對象,因此不需要實例化該類。
現在,每當我們需要設定某一天的訂單,我們可以這樣做:
當我們想檢查星期五的一個訂單時,我們可以簡單地調用write:
那么。這個設計就不會有問題了嗎?
假設你一年后來看這個代碼,要查看周一的訂單,但你忘記了WeekDay的類,這時候你可以嘗試這樣做:
星期一是一周的第一天,所以工作日應該是1,對吧?
但事實并非如此,因為靜態int變量Monday在我們的工作日類中被定義為0 !
這是一個很好的例子,說明了為什么應該避免使用整數常量。它們很容易出錯,容易混淆,而且很難調試。
用枚舉定義常量
在Java中定義常量的另一種方法是使用枚舉。
當使用枚舉時,我們的constants類是這樣的:
注意,沒有私有構造函數——程序員(您!)沒有必要強制類是不可實例化的,因為枚舉在默認情況下是不可實例化的!
將WeekDay設置為一個順序的語法與整型常量完全相同:
同樣,我們也可以處理周五的訂單:
然而,關鍵的區別在于,這是在Order類中設置和比較WeekDay變量值的唯一方法。
order.setWeekDay (1)和(order.getWeekDay() == 1)將使編譯器拋出一個錯誤,因為您試圖使用integer類型的變量,而它們應該是WeekDay類型的變量!
對于枚舉,這不再是一個問題。如果您試圖使用整數而不是WeekDay枚舉的成員,編譯器只會拋出一個錯誤,告訴您需要使用WeekDay枚舉。
換句話說,唯一能幫你檢查周五是否有訂單的方法是:
您不再需要記住constants類,如果有客戶端要使用您的代碼,他們也不必擔心。
希望這個例子向您展示了為什么在定義常量時應該始終優先使用枚舉而不是整數。枚舉將使您的代碼更不容易出錯、更易于閱讀和更易于維護!
如果在JAVA學習上遇見不會的,或者想學Java的,私信我交流!
一個小提示:如果您希望擴展您的Java技能并成為一名高級Java開發人員,我強烈建議您購買一本由Joshua Bloch編寫的最暢銷的有效Java !