Java - 使用多个布尔属性作为标志
Java - Working with multiple Boolean attributes as flags
如果我的“MyObject”对象 class 有很多 'flags'(当前为 25 个),那么更有效和可维护(即更好)的方法是什么?
我的程序在概念上是围绕数学集合论设计的。因此,用户将查询多个集合 return 哪些 MyObjects 是这些集合的成员,主要使用集合的交集
这就是我苦苦挣扎的本质:
每个 MyObject 将有 25 个 'flags'。这些标志确定 MyObject 是否能够放入前面提到的集合之一。
我的问题是,如何对这些标志进行编程?
我已经被布尔值所吸引。这意味着任何查询或将 MyObject 添加到集合中,都可能取决于标志是开还是关、1 还是 0、真还是假。
例如,我想将五个 MyObjects 分配给一个名为 North 的集合。当每个 MyObject 都分配给该集合时,将执行检查以查找标志。如果标志是 negative/off/false,则不会分配对象,并显示错误消息 returned.
到目前为止,我使用的是布尔值。比方说,在构造函数中:
{
String "Attribute1"
String "Attribute2"
String "Attribute3"
Boolean flag1 = false
Boolean flag2 = false
Boolean flag3 = false
Boolean flag4 = false
}
稍后,我的方法之一允许用户 'add' 或翻转标志以反映 MyObject 获得该标志属性。例如:
public void flipFlag(true){
this.flag == true;
}
到目前为止一切顺利。
这使我可以做我想做的事:如果 MyObjects 有正确的标志,则将它们添加到多个集合中。
但是当我想到这些标志上的其他操作时,问题就来了。将有 25 个,所以我希望能够在必要时迭代这些布尔值。我想尝试限制这个 'list' 标志被复制的次数,以便将来当我添加、删除或更改这些标志时,只有一两个地方可以编辑,而不是几十个(我目前需要一个单独的方法来翻转每个布尔值,因为我只能将 true、false 或 null 解析为方法参数)。
我还需要能够将标志迭代到 return True 标志集、False 标志集或两者。
我想我可能有一个布尔值的 HashMap,但事实证明这很难
在我的脑海中,我希望散列映射为:
Key : Value
flag1 : true
flag2 : false
flag3 : false
但事实并非如此。
任何帮助或指示表示赞赏。我在 Stack 上查看了许多类似的问题,但它们并没有提供我需要的答案。
非常感谢您的阅读。
为此目的,Java 包含一个称为 BitSet
的标准 class。它是一系列布尔值的紧凑表示,通过 int
索引访问。通常使用它的方法是为父 class 中的索引定义常量或 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 文档了解详细信息。
如果我的“MyObject”对象 class 有很多 'flags'(当前为 25 个),那么更有效和可维护(即更好)的方法是什么?
我的程序在概念上是围绕数学集合论设计的。因此,用户将查询多个集合 return 哪些 MyObjects 是这些集合的成员,主要使用集合的交集
这就是我苦苦挣扎的本质:
每个 MyObject 将有 25 个 'flags'。这些标志确定 MyObject 是否能够放入前面提到的集合之一。
我的问题是,如何对这些标志进行编程?
我已经被布尔值所吸引。这意味着任何查询或将 MyObject 添加到集合中,都可能取决于标志是开还是关、1 还是 0、真还是假。
例如,我想将五个 MyObjects 分配给一个名为 North 的集合。当每个 MyObject 都分配给该集合时,将执行检查以查找标志。如果标志是 negative/off/false,则不会分配对象,并显示错误消息 returned.
到目前为止,我使用的是布尔值。比方说,在构造函数中:
{
String "Attribute1"
String "Attribute2"
String "Attribute3"
Boolean flag1 = false
Boolean flag2 = false
Boolean flag3 = false
Boolean flag4 = false
}
稍后,我的方法之一允许用户 'add' 或翻转标志以反映 MyObject 获得该标志属性。例如:
public void flipFlag(true){
this.flag == true;
}
到目前为止一切顺利。
这使我可以做我想做的事:如果 MyObjects 有正确的标志,则将它们添加到多个集合中。 但是当我想到这些标志上的其他操作时,问题就来了。将有 25 个,所以我希望能够在必要时迭代这些布尔值。我想尝试限制这个 'list' 标志被复制的次数,以便将来当我添加、删除或更改这些标志时,只有一两个地方可以编辑,而不是几十个(我目前需要一个单独的方法来翻转每个布尔值,因为我只能将 true、false 或 null 解析为方法参数)。
我还需要能够将标志迭代到 return True 标志集、False 标志集或两者。
我想我可能有一个布尔值的 HashMap,但事实证明这很难
在我的脑海中,我希望散列映射为:
Key : Value
flag1 : true
flag2 : false
flag3 : false
但事实并非如此。 任何帮助或指示表示赞赏。我在 Stack 上查看了许多类似的问题,但它们并没有提供我需要的答案。
非常感谢您的阅读。
Java 包含一个称为 BitSet
的标准 class。它是一系列布尔值的紧凑表示,通过 int
索引访问。通常使用它的方法是为父 class 中的索引定义常量或 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 文档了解详细信息。