慎用枚举型的ordinal()方法~

笨木头  2012-04-16 19:10   Android   阅读(2,596)   0条评论

版权声明:这是看了Java Effective这本书的某个关于枚举的章节之后有感而发~不是原创~

先来一个枚举:

public enum EnumArmyLvlType {
CMD0, 
en_armu_lvl_type_divine,           /* 1.神将 */
en_armu_lvl_type_outstanding,  /* 2.卓越 */
en_armu_lvl_type_elite,              /* 3.精英 */

CMD4, CMD5,
en_armu_lvl_type_normal,         /* 6.普通 */

;

 

 

这是一个简单枚举型,代表怪物的品质等级。

 

有时候呢,我们需要把数据传递出去,比如,从Android客户端发送数据给C++服务端,我们不可能把枚举变量直接传出去吧?~这样太不可爱了~

 

于是乎呢,聪明的我,正常情况下会这么做:

int iArmyLvlType = EnumArmyLvlType.en_armu_lvl_type_outstanding.ordinal();

这是没错吖,挺好的~可是,这样不安全~

为什么呢?因为ordinal方法不是专门给我们用来做对应关系的吖,它仅仅是枚举变量的一个序号而已。

道理很简单的,就好比…我比不出来

总之嘛,这样做不专业~虽然这么做也不能说是错的。

就好比…就好比…你们自己理解,我不比了

我们不能耍小聪明~ordinal()方法得到的就是一个序号,仅仅是一个序号,不准拿来做对应关系~

呐,大家别骂我先喇~看看下面的这个做法,是不是心情舒服了很多?~

这是利用了枚举类的构造器,这样就能指定枚举变量对应的数值是多少了~

public enum EnumArmyLvlType {
/* 发现这里有什么不一样了么?没有了"CMD," 这些滥竽充数的变量了,多了(1)这样的东西,就是构造函数 */
en_armu_lvl_type_divine(1),           /* 1.神将 */
en_armu_lvl_type_outstanding(2), /* 2.卓越 */
en_armu_lvl_type_elite(3),             /* 3.精英 */
en_armu_lvl_type_normal(6),        /* 6.普通 */
;

private int iNum = 0;

/* 构造器,记住喇,必须是私有的~ */
private EnumArmyLvlType(int iNum) {
  this.iNum = iNum;
}

/* 用这个方法代替ordinal()方法,安全,专业,包退包换~ */
public int toNumber() {
  return this.iNum;
}
}

 

 

怎么样?看出来了么?这样我们就可以这样转换了:

int iArmyLvlType = EnumArmyLvlType.en_armu_lvl_type_outstanding.toNumer();

这样,toNumber()函数就是专门用来做对应关系的,这就是专职,专业,无副作用,欢迎尝试~

关于枚举型构造器的知识,要自己去百度~不准问我~

PS:

也许有人会说,为什么要这么麻烦?为什么en_armu_lvl_type_normal(6),        /* 6.普通 */ 对应的数字是6?直接改成4不就好了,根本就不会有什么麻烦,这样就可以方便地使用ordinal方法~!

这个,你听我解释,不是这样的,你听我解释..老婆,求求你听我解释,这只是一个误会…

不好意思,太入戏了。

 

其实原因是这样的,这样做是为了扩展,也是为了方便服务器。

具体原因我不太清楚,总之,做服务器的程序员告诉我,预留一些空位,这样他可以方便管理。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注