我有一种情况,我有很多 boolean 标志要在代码中维护。
情况如下-
我现在有 6 个标志 flag1、flag2、flag3、flag4、flag5、flag6。
这些标志在程序中切换。现在,这些标志可能会增加,我不喜欢带有这么多标志的代码。
我想在嵌套类中使用 boolean 数组,像这样 -
private static class Flag{
private static boolean[] flags = new boolean[]{false,false,false,false,false,false,false};
private static void enableFlag1(){
flags[0] = true;
}
private static void disableFlag1(){
flags[0] = true;
} //... So on for each flag
}
但在这里我将不得不为每个标志编写方法。我喜欢这种方法来减少标志,因为它从内部 boolean 数组表示中抽象出用户,但对于许多标志来说,这似乎是一个问题。
请协助说明最好的方法是什么?
你可以使用 EnumSet
为此目的。
EnumSets 是 long 数组中的内部实现位,使用枚举的 ordinal()
值,这非常有效,使其具有与 BitSet
相似的性能特征。 ,除了具有更高的类型安全性并且可以说更易读。
例如,给定这个枚举:
enum Features {
FEATURE1, FEATURE2, FEATURE3
}
您可以像这样使用适当的标志创建一个 EnumSet:
Set<Features> flags = EnumSet.of(FEATURE1);
这将允许像这样进行功能测试:
flags.contains(FEATURE2); // false
flags.contains(FEATURE1); // true
或者,对于多个测试,您可以与第二组进行比较:
Set<Features> requiredFlags = EnumSet.of(FEATURE1, FEATURE2);
flags.containsAll(requiredFlags); // false
Set<Features> allFlags = EnumSet.allOf(Features.class);
allFlags.containsAll(requiredFlags); // true
请注意,EnumSet
的行为与常规可变集一样。因此可以在创建集合后对其进行操作,如下所示:
Set<Features> someFlags = EnumSet.noneOf(Features.class);
someFlags.add(FEATURE1);
someFlags.equals(flags); // true
someFlags.equals(requiredFlags); // false
someFlags.add(FEATURE2);
someFlags.equals(flags); // false
someFlags.equals(requiredFlags); // true
但是,将它们视为不可变通常是个好主意,甚至可能将它们包装在对 Collections.unmodifiableSet()
的调用中
由于 EnumSet
的行为类似于常规集合,因此对其执行集合运算提供了表达成员关系、联合、交集和差异关系的好方法。