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
1700446535
1700446536
LargeConst枚举项数量:65
1700446537
1700446538
class java.util.RegularEnumSet
1700446539
1700446540
class java.util.JumboEnumSet
1700446541
1700446542
很遗憾,两者不相等。就差1个元素,两者就不相等了?确实如此,这也是我们要重点关注枚举项数量的原因。先来看看Java是如何处理的,首先跟踪allOf方法,其源代码如下:
1700446543
1700446544
public static<E extends Enum<E>>EnumSet<E>allOf(Class<E>elementType){
1700446545
1700446546
//生成一个空EnumSet
1700446547
1700446548
EnumSet<E>result=noneOf(elementType);
1700446549
1700446550
//加入所有的枚举项
1700446551
1700446552
result.addAll();
1700446553
1700446554
return result;
1700446555
1700446556
}
1700446557
1700446558
allOf通过noneOf方法首先生成一个EnumSet对象,然后把所有的枚举项都加进去,问题可能就出在EnumSet的生成上了,我们来看noneOf的代码:
1700446559
1700446560
public static<E extends Enum<E>>EnumSet<E>noneOf(Class<E>elementType){
1700446561
1700446562
//获得所有枚举项
[
上一页 ]
[ :1.700446513e+09 ]
[
下一页 ]