Java中的枚舉值 – JAVA編程語言程序開發技術文章

在C++時代就有瞭枚舉值這個類型,它是一種有序鍵值對的集合,使用枚舉類型可以在語義化和結構化之間達成一種平衡。如果我們的代碼中到處都是需要文檔才能看懂的數字或字符(串)定義的話,那將是一種非常痛苦的事情。老陳最近在學習Java,在對項目重構的時候,就需要枚舉類型來優化代碼結構,給力的是,Java和.NET等語言(環境)一樣都提供瞭對枚舉類型的直接支持!但是,我卻遇到瞭一個比較苦惱的問題……
在C++/C#/Java中,我們要定義一個簡單的枚舉值,格式如下:
1 // C++
2 // 請留意這裡的“;”號。
3 enum Colors
4 {
5     Red,
6     Green,
7     Blue
8 };

1 // C#
2 // 和C++的語法基本一致
3 enum Colors
4 {
5     Red,
6     Green,
7     Blue
8 }

1 // Java
2 // 看上去跟C#沒區別
3 enum Colors
4 {
5     Red,
6     Green,
7     Blue
8 }

而當我需要給每個枚舉值成員綁定一個特定常量的時候,Java就顯得很不給力瞭,而且差異非常大。
綁定常量的C++/C#枚舉值定義如下:
1 // C++
2 enum Colors
3 {
4     Red = 1,
5     Green = 2,
6     Blue = 3
7 };

1 // C#
2 enum Colors
3 {
4     Red = 1,
5     Green = 2,
6     Blue = 3
7 }

綁定常量的Java枚舉值定義如下:
 1 // Java
 2 // 看起來繁瑣很多瞭哦,好不給力啊!
 3 public enum Colors
 4 {
 5     Red(1), Green(2), Blue(3);
 6
 7     private int _value;
 8
 9     private Colors(int value)
10     {
11         _value = value;
12     }
13
14     public int value()
15     {
16         return _value;
17     }
18 }

看到這裡,.NET猴子們是不是顯露出某種獰笑和各種鄙視的眼眸?
相信您可能已經體會到,Java枚舉類型的成員要綁定常量的話,其語法非常繁瑣,上述舉例的代碼還是非常簡單的實現,而且從語法上講,也有很變態的地方。
然而,我們看待問題不能隻看一面,我們應該考慮考慮,Java這麼搞肯定是由它的原因的。至少,如下的代碼在C++/C#中要實現起來就不是那麼容易瞭。
 1 // Java
 2 // 老陳曰:江山如此多嬌,Java獨領風騷!
 3 public enum Colors
 4 {
 5     Red(1, "紅色"), Green(2, "綠色"), Blue(3, "藍色");
 6
 7     private int _value;
 8     private String _name;
 9
10     private Colors(int value, String name)
11     {
12         _value = value;
13         _name = name;
14     }
15
16     public int value()
17     {
18         return _value;
19     }
20
21     public String getName()
22     {
23         return _name;
24     }
25 }

看到這裡,Java猴子們笑而不語!.NET猴子各種羨慕嫉妒恨!
當然,在.NET裡面,同樣的功能是可以通過Attitude特性來實現的(具體的這裡就不再描述瞭,未來的博文中我將單獨討論這個問題),而且也符合常規的語法規范,不像Java特意安排出這麼變態的語法格式。
各種編程語言本質上都是人類的某種工具而已,Java如此做法其實也在一定的程度上優化瞭編碼體驗,不是麼?隻不過,我倒是希望各種語言能夠相互學習,不要總是引起各種陣營的猴子相互打架,打架能解決問題麼?
________________________________________
老陳是Java初學者,希望各路神仙不吝賜教!

 

作者  陳彥銘
 

發佈留言