1. 程式人生 > >專案程式碼優化:使用Java列舉常量代替類常量

專案程式碼優化:使用Java列舉常量代替類常量

專案程式碼優化:
每頁顯示商品記錄數在程式碼中原來是定義的一個類常量,因為在程式碼中多次使用到,因此在這個實現類中定義了一個類常量。

使用



這樣的程式碼執行是沒有任何問題的,但是對於以後的程式碼維護和程式的靈活擴充套件都是不好的,就算是定義了類常量,也是屬於硬編碼問題。這裡我們可以使用Java推薦使用的列舉。那麼Java列舉是怎麼使用的呢?學習C++的時候使用過,但是Java沒有怎麼使用過,有些遺忘,C++和Java中的列舉還是比較相似的,先來看看Java列舉的基本使用Java 語言中定義列舉也是使用關鍵字enum

上述定義了一個列舉型別 Color(可以說是類,因為程式碼編譯之後是Color.class位元組碼檔案,這個和介面還是蠻相似的).
上面的定義,還可以改成下面的這種形式

其實,列舉的成員就是列舉物件,只不過他們是靜態常量而已。使用javap命令(javap 檔名<沒有後綴.class>)可以反編譯 class 檔案使用CMD先編譯這個Java原始檔Color.java,再使用javap Color命令反編譯:

我們可以使用普通類或者介面來模擬列舉,下面定義一個Color類。

對比一下,就明白了,如果按照這個邏輯,是否還可以為其新增另外的構造方法?答案是肯定的!

為Color聲明瞭兩個成員變數,併為其構造帶引數的構造器。如果你這樣建立一個列舉是錯誤的。

對於類來講,最好將其成員變數私有化,然後,為成員變數提供 get、set 方法。
按照這個原則,可以進一步寫好列舉Color.

但是,java設計enum的目的是提供一組常量,方便使用者設計。如果我們冒然的提供set方法(外界可以改變其成員屬性),好像是有點違背了設計的初衷。那麼,我們應該捨棄set方法,保留get方法。
普通類,我們可以將其例項化,那麼,能否例項化列舉呢?在回答這個問題之前,先來看看,編譯之後的Color.class 檔案
可以看出,編譯器為其構造方法加上了private,那麼也就是說,我們無法例項化列舉。所有列舉類都繼承了Enum類的方法,這點可以從反編譯出來的原始碼看到,包括toString 、equals、hashcode 等方法。因為equals、hashcode方法是被final修飾的,所以不可以被列舉重寫(只可以繼承)。但是,可以重寫toString方法。

我們可以看一下Enum原始碼

對於列舉的使用可以看考部落格:
Java 列舉(enum) 詳解7種常見的用法
地址:http://blog.csdn.net/qq_27093465/article/details/52180865
對於定義的列舉Color,簡單測試一下:
結果:
具體應用:定義列舉
使用列舉