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 ]
[
下一页 ]