1. 程式人生 > >Java中定義常量幾種方式

Java中定義常量幾種方式

在開發中定義常量是很常見的事,但常量定義有哪幾種方式可選?各種定義方式有什麼優缺點?咱們就用這篇小文來梳理下^_^

1.通過介面Interface來定義(不推薦)

定義方式如下:

我們可以這樣使用它:

這種定義方式的優點:

適合懶人使用,為什麼呢?

我們知道,在interface中定義的常量預設是public static final型別的。所以我們定義String SUMMER = "Summner";的時候,就相當於預設加了public static final字首,意思與public static final String SUMMER = "Summer";等價。

在介面中定義常量,可以免去加public static final幾個單詞,少敲幾次鍵盤,但可以達到同樣的效果。嗯,是挺方便的。

但是不推薦這種方式。張羅了幾個原因,如下:

1)Java中設計出介面這種語法,就是為了用來實現或者繼承的,如果我們在實現類或者子類介面中定義了同名的常量,那麼子類介面或者實現類引用同名的常量,就可能不一致。是不是很容易造成混亂。

2)與介面的定義不相符,介面是一種規範,一種協議規定,主要用來定義必須要實現的API。用介面來定義常量,與創造介面的目的不相符,也有點殺雞用牛刀,大財小用。

3)在interface中定義的常量屬於編譯型常量,每次更改常量值,都要重新編譯所有引用到它的類。

舉個小例子,我們將SUMMER常量更改為"Summer_Great"。編譯Season後,我們看到介面Season中的SUMMER已經更改。

但是Test中的Season.SUMMER還是原值"Summer",沒有改變,必須重新編譯Test.java才行。

2.通過常量類來定義

我們知道一個類如果允許被繼承,那麼它定義的常量就有可能被子類覆蓋,子類如果定義了同名的常量,就會造成子類和父類對同一個常量的定義不同,很容易造成困惑。所以呢,如果將一個類定義為常量類,那麼這個類就不能允許被繼承。所以呢,我們就有了以下兩種定義常量類的方式。

1)將常量類定義為final類

2)將建構函式私有化

我們可以這樣使用它:

這種方式最常用,但這種定義也是編譯型常量,如果更改常量值的話,還是需要重新編譯所有引用類。

3.增加static方法的常量類

那麼怎麼解決編譯型常量這個問題呢?增加static方法。

我們可以這樣使用它:

這樣,如果改變了常量定義,只需要重新編譯一下Season.java即可。

4.使用列舉類enum(推薦)

定義方式如下:

我們可以這樣使用它:

列舉類限定了季節只能有春夏秋冬,不會引入其他什麼季節,很安全;再者enum天生不允許被繼承的,非常適合用作常量類。

時間不早了,該睡覺了,今天先講到這兒了,下週繼續開講^_^。