在探索 Java EnumSet 时,我遇到了两个包私有类,
来自 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 背后的逻辑是什么?
我想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)
工会如何正确完成?
所以我在我们的应用程序中转换一些位域来代替使用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()方法的东西,但我看不到任何似乎有这种效果的东西.
我有一个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) 我有一个用例:
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)
enumset ×5
java ×5
enums ×3
android ×1
arrays ×1
bit-fields ×1
collections ×1
generics ×1
guava ×1
immutability ×1
inheritance ×1
set ×1