2

我正在为将布尔值打包成一个字节的方法编写单元测试。不同的位位置由枚举的值决定,目前只有 5 个值,但可以想象(尽管极不可能)这个数字可以达到 9。

我想要一个简单的测试:

私有字节 m_myNum;枚举 MyEnum {...}

断言(sizeof(m_myNum) <= MyEnum.values().length);

我的印象是 Java 中没有 sizeof 函数。最优雅的解决方法是什么?

- -编辑

我不认为我很清楚。我不关心正常的运行时间。我的问题是我现在可以使用存储所有信息的字节编写此代码,但是随着 Enum 在代码的不相关部分中增长,我可能会达到我的位掩码代码中断的地步。我不想在已部署的应用程序中使用它,而是希望有一个单元测试在枚举中的状态数超过存储变量中的位数时失败,因此当程序员添加第九个枚举时,他们可以调整变量的类型为多于八位的东西。

4

6 回答 6

2

我认为这个测试可以满足您的要求。获得比这更通用的内容可能是在浪费您的时间。

public void testEnumSizeLessThanOneByte() throws Exception 
{ 
    assertTrue("MyEnum must have 8 or less values.", 
                MyEnum.values().length <= 8);
}
于 2008-12-02T19:14:19.770 回答
1

如果这是一个真正的问题并且性能不是那么重要,你总是可以使用bitset

于 2008-12-02T21:37:25.723 回答
0

在 Java 中,字节具有固定大小(8 位),因此不需要 sizeof。

于 2008-12-02T18:42:46.650 回答
0

首先,是的,Java 中没有 sizeof 运算符。但是 sizeof(byte) 无论如何总是1。这真的是你想说的吗?

其次,您打算如何将 9 个布尔值放入一个字节中?我希望不要使用位掩码。

如果您只想找到设置的最高位,您可以使用(请参阅此处Integer.highestOneBit(m_myNum & 0xFF)的文档)。


编辑:当枚举中有太多值时,您谈到将存储更改为更大的类型。根据这个问题,除非你有一个数组,否则没有理由不使用 abyte而不是a 。int所以我会说int至少使用 a,long如果大小超过 32,则升级到 a。够简单吗?

于 2008-12-02T18:43:07.960 回答
0

我发现这个问题可以帮助你:-)

不幸的是,Java 中没有 sizeof(),但是看看这个问题的答案。我发现有趣的是这篇来自 JavaWorld 的文章。

于 2008-12-02T18:50:36.277 回答
0

我知道您正在尝试提出一个通用的解决方案,但是在这种情况下,我会采取懒惰的方式并硬编码大小并添加一些注释。

静态最终 int MAX_BITS_IN_MY_NUM = 8;// 当前设置为字节大小。  
                                         // 如果数据类型从字节更改为大于字节的类型,则更新。
...
assertTrue(MAX_BITS_IN_MY_NUM >= MyEnum.values().length);
于 2008-12-02T19:19:30.837 回答