【问题标题】:Java - Working with multiple Boolean attributes as flagsJava - 使用多个布尔属性作为标志
【发布时间】:2021-10-10 14:13:21
【问题描述】:

让我的“MyObject”对象类拥有许多“标志”(目前为 25 个),有什么更有效和可维护(即更好)的方法?

我的程序在概念上围绕数学集合论。因此,用户将查询多个集合以返回哪些 MyObjects 是这些集合的成员,主要使用集合的交集

这就是我苦苦挣扎的本质:

每个 MyObject 将有 25 个“标志”。这些标志确定 MyObject 是否能够放入前面提到的集合之一中。

我的问题是,如何对这些标志进行编程?

我倾向于布尔值。这意味着任何查询或将 MyObject 添加到集合中,都取决于标志是 On 还是 Off、1 还是 0、True 或 False。

例如,我想将五个 MyObject 分配给一个名为 North 的集合。由于每个 MyObject 都分配给该集合,因此将执行检查以查找标志。如果标志为负/关闭/假,则不会分配对象,并返回错误消息。

到目前为止,我使用了布尔值。例如,在构造函数中:

{

String "Attribute1"
String "Attribute2"
String "Attribute3"

Boolean flag1 = false
Boolean flag2 = false
Boolean flag3 = false
Boolean flag4 = false

}

稍后,我的一种方法允许用户“添加”或翻转标志以反映 MyObject 获得该标志属性。例如:

public void flipFlag(true){
    this.flag == true;
}

到目前为止一切顺利。

这让我可以做我想做的事:如果 MyObjects 具有正确的标志,则将它们添加到多个集合中。 但是当我考虑对这些标志的其他操作时,问题就来了。其中将有 25 个,所以我希望能够在必要时迭代这些布尔值。我想尝试限制复制此标志“列表”的次数,以便将来当我添加、删除或更改这些标志时,有一个或两个位置可以编辑,而不是几十个(我目前需要一个单独的方法来翻转每个布尔值,因为我只能将 true、false 或 null 解析为方法参数)。

我还需要能够遍历标志以返回一组 True 标志、一组 False 标志或两者。

我认为我可能有一个布尔值的 HashMap,但事实证明这很困难

在我的脑海中,我希望哈希映射是:

Key : Value
flag1 : true
flag2 : false
flag3 : false

但这似乎不是它的工作方式。 任何帮助或指针表示赞赏。我在 Stack 上查看了许多类似的问题,但它们并没有完全提供我需要的答案。

非常感谢您的阅读。

【问题讨论】:

  • 你如何决定标志的总数(构建与运行时)?检查是如何进行的?调用者是否知道对象中的所有标志?
  • 标志总数不应在软件更新之外改变(事实上,极少如此),因此,在构建时。检查会经常发生,因为用户会定期将 MyObjects 分配给不同的 Set,并且他们会知道所有的标志,它们最终会在 GUI 中轻松访问。
  • 如果是构建时间,HashMap<Feature,Boolean> Feature 是一个枚举呢?这可能会带来更多“严格”
  • 我将研究枚举,因为这也向我提出了建议。我认为@tim-moore 的答案将满足我的所有需求,但我仍将研究涉及 enum 的解决方案。谢谢。

标签: java boolean flags


【解决方案1】:

为此,Java 包含一个名为BitSet 的标准类。它是一系列布尔值的紧凑表示,由int 索引访问。使用它的常用方法是为父类中的索引定义常量或enum 值。例如:

public static final int FLAG1 = 0;
public static final int FLAG2 = 1;
// ... and so on

private BitSet flags = new BitSet(25); // or however many flags you need

然后您可以通过以下方式访问各个标志:

flags.get(FLAG1);

设置它们:

flags.set(FLAG1, true);

或翻转它们(即反转值):

flags.flip(FLAG1);

还有许多其他可用的操作。详情请查看 API 文档。

【讨论】:

  • 这很完美,它让我可以灵活地完成我需要完成的事情,谢谢!我现在只是在试验它。试图看看我是否应该为每个标志设置单独的位集,或者我是否可以使用一组。再次感谢!
  • 您可以将所有标志放入一个 BitSet。很高兴这有帮助!
猜你喜欢
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多