灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2055回复:0

Java中的枚举值

楼主#
更多 发布于:2012-09-08 09:38


在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初学者,希望各路神仙不吝赐教!


喜欢0 评分0
游客

返回顶部