标签: enumset

EnumSet真正意味着什么?

我有以下示例:

import java.util.EnumSet;
import java.util.Iterator;

public class SizeSet {

    public static void main(String[] args) {
        EnumSet largeSize = EnumSet.of(Size.XL,Size.XXL,Size.XXXL);
        for(Iterator it = largeSize.iterator();it.hasNext();){
            Size size = (Size)it.next();
            System.out.println(size);
        }
    }
}


enum Size {
  S, M, L, XL, XXL, XXXL;

}
Run Code Online (Sandbox Code Playgroud)

在这段代码中,我可以理解Enum创建了一个Enum类型的大小.

我的问题是:是largeSizeEnumSet类型的对象吗?它到底意味着什么?我真的想更好地理解它.

java enums object enumset

66
推荐指数
6
解决办法
6万
查看次数

使用java枚举实现位域

我维护一个大型文档存档,我经常使用位字段来记录处理期间或验证文档时的状态.我的遗留代码只使用静态int常量,例如:

static int DOCUMENT_STATUS_NO_STATE = 0
static int DOCUMENT_STATUS_OK = 1
static int DOCUMENT_STATUS_NO_TIF_FILE = 2
static int DOCUMENT_STATUS_NO_PDF_FILE = 4
Run Code Online (Sandbox Code Playgroud)

通过设置适当的标志,可以很容易地指示文档所处的状态.例如:

status = DOCUMENT_STATUS_NO_TIF_FILE | DOCUMENT_STATUS_NO_PDF_FILE;
Run Code Online (Sandbox Code Playgroud)

由于使用静态常量的方法是不好的做法,并且因为我想改进代码,所以我希望使用Enums来实现相同的目标.有一些要求,其中之一是需要将状态作为数字类型保存到数据库中.因此需要将枚举常量转换为数值.以下是我的第一种方法,我想知道这是否是正确的方法呢?

class DocumentStatus{

    public enum StatusFlag {

        DOCUMENT_STATUS_NOT_DEFINED(1<<0),
        DOCUMENT_STATUS_OK(1<<1), 
        DOCUMENT_STATUS_MISSING_TID_DIR(1<<2),
        DOCUMENT_STATUS_MISSING_TIF_FILE(1<<3),
        DOCUMENT_STATUS_MISSING_PDF_FILE(1<<4),
        DOCUMENT_STATUS_MISSING_OCR_FILE(1<<5),
        DOCUMENT_STATUS_PAGE_COUNT_TIF(1<<6),
        DOCUMENT_STATUS_PAGE_COUNT_PDF(1<<7),
        DOCUMENT_STATUS_UNAVAILABLE(1<<8);


        private final long statusFlagValue;

        StatusFlag(long statusFlagValue) {
            this.statusFlagValue = statusFlagValue;
        }

        public long getStatusFlagValue(){
            return statusFlagValue;
        } 

       }


    /**
     * Translates a numeric status code into a Set of StatusFlag enums
     * @param numeric statusValue 
     * @return …
Run Code Online (Sandbox Code Playgroud)

java enums enumset

38
推荐指数
5
解决办法
3万
查看次数

如何创建空的EnumSet?

我正在努力使用EnumSet,因为它令人惊讶地没有一个简单的构造函数,并且它的方法不喜欢null值.

我想出了什么: EnumSet<MyClass> x = EnumSet.copyOf(Collections.<MyClass>emptySet());

这有点有效,但对我来说似乎不对.

java enumset

37
推荐指数
2
解决办法
1万
查看次数

为什么EnumSet有很多重载的"方法"?

在浏览EnumSet<E> of方法时,我看到了多个of方法的重载实现:

public static <E extends Enum<E>> EnumSet<E> of(E e)

public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2)

.
.

public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5)
Run Code Online (Sandbox Code Playgroud)

然后用另一个重载方法 varargs

public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest) {
    EnumSet<E> result = noneOf(first.getDeclaringClass());
    result.add(first);
    for (E e : rest)
        result.add(e);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

当这个varargs可以处理其他实现时,为什么这个方法会以这种方式重载?这有什么具体原因吗?

我曾经历过同样的Javadoc,但我找不到任何令人信服的解释.

java collections enumset

33
推荐指数
4
解决办法
1135
查看次数

带有EnumSet Stream的java.util.stream.Collectors

我试图用代替位掩码来代码

public static Set<Amenities> fromBitFlags(int bitFlag) {
    return ALL_OPTS.stream().filter(a -> (a.ameityId & bitFlag) > 0).collect(Collectors.toSet());
}
Run Code Online (Sandbox Code Playgroud)

我想返回EnumSet而不是简单的集合(不要因为转换而放弃EnumSet的实用性).

需要一些有关如何创建自定义收集器以收集EnumSet的说明.

java enumset java-8 java-stream

28
推荐指数
1
解决办法
7436
查看次数

EnumSet来自数组,最短的变体?

我需要一个EnumSet数组(通过varargs方法参数给出).首先,我很惊讶在EnumSet(有EnumSet#of(E first, E... rest))中没有varargs构造函数方法.作为一种解决方法,我使用了以下变体:

EnumSet<Options> temp = EnumSet.copyOf(Arrays.asList(options));
Run Code Online (Sandbox Code Playgroud)

但是,这会触发一个java.lang.IllegalArgumentException: Collection is empty.所以,现在我最终得到了以下内容,看起来有些荒谬:

EnumSet<Options> temp = options.length > 0 ? 
                        EnumSet.copyOf(Arrays.asList(options)) : 
                        EnumSet.noneOf(Options.class);
Run Code Online (Sandbox Code Playgroud)

如果当然这可以转移到一些实用方法,但仍然,我问自己是否有一种更简单的方法使用现有的方法?

java arrays enums variadic-functions enumset

25
推荐指数
5
解决办法
1万
查看次数

在现代Java 8 API中使用位域而不是EnumSet的理由

EnumSet,就像enum它自身一样古老(自Java 5开始),应该是比特场的用例的非妥协替代品:像位域一样快速和精简(好吧,除了不是原始类型),以及类型安全的启动.另一方面,最新和多年来最受期待的Java API-Streams API - 毫不掩饰地使用了bitfields Spliterator特性.

我是否应该认为上述内容是核心Java专家的明确承认,EnumSet毕竟不是那么好?我是否应该重新考虑从不使用位域的常见最佳实践建议?

java enumset bit-fields java-8

19
推荐指数
1
解决办法
1282
查看次数

结合Java EnumSets

如果我有一个枚举,我可以使用方便的EnumSet类创建一个EnumSet

enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES }
EnumSet<Suit> reds = EnumSet.of(Suit.HEARTS, Suit.DIAMONDS);
EnumSet<Suit> blacks = EnumSet.of(Suit.CLUBS, Suit.SPADES);
Run Code Online (Sandbox Code Playgroud)

给两个EnumSets,我怎样才能创建一个包含这两个集的并集的新EnumSet?

EnumSet<Suit> redAndBlack = ?

java enumset

12
推荐指数
1
解决办法
9196
查看次数

java enums订购

我使用java枚举来定义如何使用按钮渲染模态窗口(Vaadin处理渲染).我的问题是,当我运行gui时,我的按钮每次都以随机顺序出现.所以我的问题是这个,因为我使用枚举设置来保持我的按钮,这将是无序的吗?什么是最好的方式使它成为有序列表?

我的设置枚举

public enum MODAL_SETTINGS {
    NEW_MODAL_WINDOW("menu.context.new", "400", MODAL_BUTTON.SAVE, MODAL_BUTTON.CANCEL),
    EDIT_MODAL_WINDOW("menu.context.modify","400", MODAL_BUTTON.UPDATE, MODAL_BUTTON.CANCEL),
    DELETE_MODAL_WINDOW("menu.context.delete", "250", false, MODAL_BUTTON.DELETE, MODAL_BUTTON.CANCEL);

    private EnumSet<MODAL_BUTTON> buttons;
    private String caption;
    private String width;
    private boolean isResizable = true;

    private MODAL_SETTINGS(String caption, String width, MODAL_BUTTON... buttons){
        this.setCaption(caption);
        this.setWidth(width);
        this.buttons = EnumSet.copyOf(Arrays.asList(buttons));
    }

    private MODAL_SETTINGS(String caption, String width, boolean isResizable, MODAL_BUTTON... buttons){
        this.setCaption(caption);
        this.setWidth(width);
        this.isResizable = isResizable;
        this.buttons = EnumSet.copyOf(Arrays.asList(buttons));
    }

    public EnumSet<MODAL_BUTTON> getButtons(){
        return buttons;
    }

    @Override
    public String toString(){
        String s = super.toString();
        s=s.replaceAll("_", ".");
        return …
Run Code Online (Sandbox Code Playgroud)

java enums enumset

11
推荐指数
2
解决办法
2万
查看次数

为什么EnumSet或EnumMap可能比它们的哈希对应物更具性能?

以下内容来自EnumMapJava docImplementation Note部分:

实施说明:所有基本操作都在恒定时间内执行.它们很可能(虽然不能保证)比它们的HashMap对应物更快.

我也在java doc中看过类似的行EnumSet.我想知道为什么它更有可能的是EnumSets,并EnumMaps会比他们的同行散列更多更快?

java enums enum-map enumset

10
推荐指数
1
解决办法
2754
查看次数