版权声明:这是看了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();
也许有人会说,为什么要这么麻烦?为什么en_armu_lvl_type_normal(6), /* 6.普通 */ 对应的数字是6?直接改成4不就好了,根本就不会有什么麻烦,这样就可以方便地使用ordinal方法~!
这个,你听我解释,不是这样的,你听我解释..老婆,求求你听我解释,这只是一个误会...
不好意思,太入戏了。
其实原因是这样的,这样做是为了扩展,也是为了方便服务器。
具体原因我不太清楚,总之,做服务器的程序员告诉我,预留一些空位,这样他可以方便管理。