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如此做法其实也在一定的程度上优化了编码体验,不是么?只不过,我倒是希望各种语言能够相互学习,不要总是引起各种阵营的猴子相互打架,打架能解决问题么?

转载于:https://my.oschina.net/lhjtianji/blog/162008

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值