java EnumSet学习

作者: undefined可以吗 | 来源:发表于2018-01-13 21:02 被阅读0次

一、EnumSet 简单介绍

1、A specialized Set implementation for use with enum types. 
2、All of the elements in an enum set must come from a single enum type 
     that is specified, explicitly or implicitly, when the set is created.
EnumSet是Set的一种实现,它必须要配合枚举使用,并且EnumSet内部的元素只能是一种类型

二、EnumSet的内部设计思路

EnumSet是一个抽象类,内部多处采用静态工厂方法。它不对外提供构造函数,只能通过一系列静态方法,如of(...)、noneOf(...)、copyOf(...)、complementOf(...)来获取对象实例。这样做的好处是它对外封装了内部实现,如EnumSet返回的真正的类型是它的子类:RegularEnumSet或者JumboEnumSet,但外部使用者并不知道这些,当EnumSet API升级时,如添加一个子类实现,原先引用的地方不用发生改变。

//核心方法,其他获取EnumSet实例的方法都调用了这个方法
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
        Enum<?>[] universe = getUniverse(elementType);
        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);
}

三、EnumSet之RegularEnumSet的高效之处

首先,在EnumSet内部,有一个成员变量final Enum<?>[] universe;,它持有该EnumSet中的元素所对应的枚举类型的所有值(实例),当调用noneOf()方法时,都会调用getUniverse()获取到枚举类型的所有实例,并赋值给universe变量。然后在RegularEnumSet子类中,有一个成员变量private long elements,可以根据elements的值进行位运算得到的结果,到universe数组取得相应的元素。当要添加元素或者删除元素时,也只需要改变elements的值即可。

   /**
     * Returns all of the values comprising E.
     * The result is uncloned, cached, and shared by all callers.
     */
    private static <E extends Enum<E>> E[] getUniverse(Class<E> elementType) {
        return SharedSecrets.getJavaLangAccess()
                                        .getEnumConstantsShared(elementType);
    }
   /**
     * Returns <tt>true</tt> if this set contains the specified element.
     */
    public boolean contains(Object e) {
        if (e == null)
            return false;
        Class<?> eClass = e.getClass();
        if (eClass != elementType && eClass.getSuperclass() != elementType)
            return false;

        return (elements & (1L << ((Enum<?>)e).ordinal())) != 0;
    }

   /**
     * Adds the specified element to this set if it is not already present.
     */
    public boolean add(E e) {
        typeCheck(e);

        long oldElements = elements;
        elements |= (1L << ((Enum<?>)e).ordinal());
        return elements != oldElements;
    }

1、JumboEnumSet后面可能会再研究
2、如有不正确或者想交流的地方,欢迎指出

相关文章

  • java EnumSet学习

    一、EnumSet 简单介绍 二、EnumSet的内部设计思路 EnumSet是一个抽象类,内部多处采用静态工厂方...

  • Effective Java 2.0_Java中的EnumSet

    文章作者:Tyan博客:noahsnail.com 1. EnumSet EnumSet是Java Set接口的一...

  • Android中不推荐使用Enum

    一、Enum的产生 Java1.5中引入了枚举的语法,包括Enum,EnumSet,EnumMap等。其中Enum...

  • 第 90 条:考虑用序列化代理代替序列化实例

    EnumSet

  • 提示三十六

    提示三十六:使用 EnumSet 替代位属性。 EnumSet继承了AbstractSet并且实现了Cloneab...

  • Enum

    java定义新的类型的方式:类、接口、枚举 取出枚举的全部类容: 类集对枚举的支持:EnumMap、EnumSet...

  • EnumSet

    EnumSet是一个抽象方法,需要通过静态方法创建: EnumSet其它的一些静态工厂方法(省略了修饰public...

  • Java1.8-EnumSet源码分析

    概述   Set体系中有一个不常用的抽象类是EnumSet,这个类及对应的子类是专门为枚举服务的,所以EnumSe...

  • Java集合(十一)--EnumSet简析

    EnumSet是用于枚举类型的专用Set实现。EnumSet中的所有元素必须来自单个枚举类型,该类型在创建集时显式...

  • EnumSet,EnumMap

    EnumSet 枚举单参数能参与switch case值判断: 测试结果: 每个枚举类型颜色是该Color类的一个...

网友评论

    本文标题:java EnumSet学习

    本文链接:https://www.haomeiwen.com/subject/twfhoxtx.html