java - 处理 boolean 标志的最佳方式

标签 java

<分区>

我有一种情况,我有很多 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 的行为类似于常规集合,因此对其执行集合运算提供了表达成员关系、联合、交集和差异关系的好方法。

关于java - 处理 boolean 标志的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36161163/

相关文章:

java - 如何删除 MiGLayout 中组件之间的空间

java - hibernate-spatial-4.0 创建 bytea 列类型而不是几何图形

java - 当我在 Android Studio 的菜单中说添加地点时,它有时会打开 map ,有时应用程序会在不打开的情况下关闭

java.util.zip.ZipException : error in opening zip filein JBOSS Server

java - 在 JavaFX 中将 ImageView 缩放到特定高度

java - JMap 转储格式规范

java - BufferedReader readLine 和 OutputStreamWriter .write

java - 有没有办法通过 jndi 在 <util :properties/> tag? 中传递文件位置

java - Lwjgl MouseDwheel 没有得到 0

java - OS X 命令行 java 窗口出现