打字猴:1.700446485e+09
1700446485 编写高质量代码:改善Java程序的151个建议 [:1700438161]
1700446486 编写高质量代码:改善Java程序的151个建议 建议89:枚举项的数量限制在64个以内
1700446487
1700446488 为了更好地使用枚举,Java提供了两个枚举集合:EnumSet和EnumMap,这两个集合的使用方法都比较简单,EnumSet表示其元素必须是某一枚举的枚举项,EnumMap表示Key值必须是某一枚举的枚举项,由于枚举类型的实例数量固定并且有限,相对来说EnumSet和EnumMap的效率会比其他Set和Map要高。
1700446489
1700446490 虽然EnumSet很好用,但是它有一个隐藏的特点,我们逐步分析。在项目中一般会把枚举用作常量定义,可能会定义非常多的枚举项,然后通过EnumSet访问、遍历,但它对不同的枚举数量有不同的处理方式。为了进行对比,我们定义两个枚举,一个数量等于64,一个是65(大于64即可,为什么是64而不是128、512呢?稍后解释),代码如下:
1700446491
1700446492 //普通枚举项,数量等于64
1700446493
1700446494 enum Const{
1700446495
1700446496 A, B,C,……,PC, QC, RC;
1700446497
1700446498 }
1700446499
1700446500 //大枚举,数量超过64
1700446501
1700446502 enum LargeConst{
1700446503
1700446504 A, B,C,……,KB, LB, MB;
1700446505
1700446506 }
1700446507
1700446508 Const中的枚举项数量是64,LargeConst的数量是65,其中的……号代表省略的枚举项(注意此处只是省略了,Java不支持省略号)。接下来我们希望把这两个枚举转换为EnumSet,然后判断一下它们的class类型是否相同,代码如下:
1700446509
1700446510 public static void main(String[]args){
1700446511
1700446512 //创建包含所有枚举项的EnumSet
1700446513
1700446514 EnumSet<Const>cs=EnumSet.allOf(Const.class);
1700446515
1700446516 EnumSet<LargeConst>lcs=EnumSet.allOf(LargeConst.class);
1700446517
1700446518 //打印出枚举项数量
1700446519
1700446520 System.out.println(“Const枚举项数量:”+cs.size());
1700446521
1700446522 System.out.println(“LargeConst枚举项数量:”+lcs.size());
1700446523
1700446524 //输出两个EnumSet的class
1700446525
1700446526 System.out.println(cs.getClass());
1700446527
1700446528 System.out.println(lcs.getClass());
1700446529
1700446530 }
1700446531
1700446532 程序很简单,现在的问题是:cs和lcs的class类型是否相同?应该相同吧,都是EnumSet类的工厂方法allOf生成的EnumSet类,而且JDK API也没有提示EnumSet有子类。我们来看输出结果:
1700446533
1700446534 Const枚举项数量:64
[ 上一页 ]  [ :1.700446485e+09 ]  [ 下一页 ]