EnumSet源码解析

admin 2019-7-22 128

EnumSet源码解析

现在我们来说说EnumSet,很多人以为EnumSet没有用处,那为什么JDK要特意加上这么一个类呢? 
我们来看看这样一个使用场景: 
Enum Property{A,B,C,D,E,F} 
public void getEntity(Set propertys){} 
根据不同的属性获取不同的对象,这些属性可以任意组合。这好像是位域的使用范围。 
对的,EnumSet既有位域的简洁和性能优势,又具有枚举的直观易用的优点。 
上述例子,我们可以使用

getEntity(EnumSet.of(Property.A,Property.B))

EnumSet是个抽象类,我们只能通过它提供的静态方法来返回Enumset的实现类的实例,它提供了很多有用的方法

EnumSet.allOf(Property.class) // all elements
EnumSet.range(Property.A,Property.C) //A,B,C

这是它的易用性,那么来看看它的性能优势是怎么体现的呢? 
我们看一下源码:

    public static <E extends Enum<E>> EnumSet<E> range(E from, E to) {
        if (from.compareTo(to) > 0)
            throw new IllegalArgumentException(from + " > " + to);
        EnumSet<E> result = noneOf(from.getDeclaringClass());
        result.addRange(from, to);
        return result;
    }

     abstract void addRange(E from, E to);

    public static <E extends Enum<E>> EnumSet<E> of(E e) {
        EnumSet<E> result = noneOf(e.getDeclaringClass());
        result.add(e);
        return result;
    }

    abstract void addAll();
我们调用EnumSet的静态方法创建实例时,都会调用noneOf返回一个EnumSet的实例,不同的实例会实现不同的抽象方法。那么我们来看看这个noneOf方法
   public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
       Enum<?>[] universe = getUniverse(elementType);   //Returns all of the values comprising E
       if (universe == null)
           throw new ClassCastException(elementType + " not an enum");

       if (universe.length <= 64)
           return new RegularEnumSet<>(elementType, universe);
       else
           return new JumboEnumSet<>(elementType, universe);
   }

可以看出,如果Enum的个数小于等于64,使用的就是RegularEnumSet这个实现,否则JumboEnumSet。


少客联盟- 版权声明 1、本主题所有言论和图片纯属会员个人意见,与少客联盟立场无关。
2、本站所有主题由该帖子作者发表,该帖子作者admin少客联盟享有帖子相关版权。
3、少客联盟管理员和版主有权不事先通知发贴者而删除本文。
4、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者admin少客联盟的同意。
5、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任。
6、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责。
7、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意。
8、官方反馈邮箱:chinasuc@chinasuc.cn


上一篇:数据库审计
下一篇:爬虫技术的门道,这篇文章总结的最全
Whatever is worth doing is worth doing well. juvenile hacker league
最新回复 (0)
    • 少客联盟
      2
        登录 注册 QQ登录(停用)
返回