标签: enumset

为什么 EnumSet 使用 RegularEnumSet 和 JumboEnumSet 来实现不同的大小。它如何影响性能?

在探索 Java EnumSet 时,我遇到了两个包私有类,

  1. 正则枚举集
  2. 巨型枚举集

来自 EnumSet 来源:

if (universe.length <= 64)
   return new RegularEnumSet<>(elementType, universe);
else
   return new JumboEnumSet<>(elementType, universe);
Run Code Online (Sandbox Code Playgroud)

RegularEnumSet构造函数也如下所示:

RegularEnumSet(Class<E>elementType, Enum[] universe) {
    super(elementType, universe);
}
Run Code Online (Sandbox Code Playgroud)

而在JumboEnumSet构造函数的情况下是:

JumboEnumSet(Class<E>elementType, Enum[] universe) {
   super(elementType, universe);
   elements = new long[(universe.length + 63) >>> 6];
}
Run Code Online (Sandbox Code Playgroud)

所以我的疑问是:

  • 为什么它根据大小使用不同的 EnumSet。它如何影响性能?

  • 使用元素数组的 JumboEnumSet 背后的逻辑是什么?

java collections set enumset

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

用番石榴联合两个ImmutableEnumSets

我想ImmutableEnumSets从番石榴结合两个.这是我的尝试:

public final class OurColors {

    public enum Colors {
        RED,
        GREEN,
        BLUE,
        YELLOW,
        PINK,
        BLACK
    }

    public final static ImmutableSet<Colors> myColorSet =
            Sets.immutableEnumSet(Colors.BLUE,
                                  Colors.GREEN);

    public final static ImmutableSet<Colors> yourColorSet =
            Sets.immutableEnumSet(Colors.YELLOW,
                                  Colors.PINK);

    public final static ImmutableSet<Colors> ourColorSet =
            Sets.union(myColorSet, ourColorSet);
}
Run Code Online (Sandbox Code Playgroud)

该字段ourColorSet不编译,它失败了

Type mismatch: cannot convert from Sets.SetView<OurColors.Colors> to
ImmutableSet<OurColors.Colors>
Run Code Online (Sandbox Code Playgroud)

工会如何正确完成?

java immutability enumset guava

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

检查/或使用EnumSet

所以我在我们的应用程序中转换一些位域来代替使用EnumSet,我很好奇是否有更好的方法来对X | Y进行比较.目前我们做的事情如下:

if(bitfield & (X | Y) != 0) {
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

EnumSet等效似乎是:

if(enumSet.contains(X) || enumSet.contains(Y)) {
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

有更清洁的方法吗?我知道你可以这样检查containsAll():

EnumSet flagsToCheck = EnumSet.of(X, Y);
if(enumSet.containsAll(flagsToCheck)) {
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

但这是一个你想知道是否(X & Y)已设置的场景.有没有相同的方法来检查(X | Y)?我认为会有类似于containsAny()方法的东西,但我看不到任何似乎有这种效果的东西.

java enums enumset bit-fields

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

将EnumSet转换为整数数组

我有一个EnumSet,并希望将其转换为其序数值的数组.例如:

enum MyEnum { A, B, C; }
EnumSet enumSet = EnumSet.of(MyEnum.A, MyEnum.C);
Run Code Online (Sandbox Code Playgroud)

我想得到什么:

[0, 2]
Run Code Online (Sandbox Code Playgroud)

java arrays enums android enumset

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

EnumSet 作为泛型接口中的参数

我有一个用例:

inteface A{
  get(EnumSet<?> fetchModes);
}
class B implements A{

  //Here FetchMode is an enum
  get(EnumSet<FetchMode> fetchMode){
   //Some logic here
  }
}
Run Code Online (Sandbox Code Playgroud)

但它抛出编译时错误:

类 B 的方法 get 与类型 A 的 get(EnumSet fetchMode) 具有相同的擦除,但不会覆盖它。

我读过 Enums 不能是通用的,但是有什么方法可以实现这个用例吗?(基本上希望 EnumSet 是通用的,不同的实现可以传递不同的 Enum)

java generics inheritance enums enumset

0
推荐指数
1
解决办法
189
查看次数