我正在为一个将布尔值打包成一个字节的方法编写一个单元测试。各个位的位置由枚举值决定,现在只有5个值,但可以想象(虽然极不可能)这个数字可以达到9。
我想要一个简单的测试:
私有字节m_myNum; 枚举MyEnum {...}
断言(sizeof(m_myNum)< = MyEnum.values()。length);
我的印象是Java中没有sizeof函数。什么是最优雅的解决方法?
--- EDIT
我认为我不清楚。我不关心正常运行时。我的问题是我现在可以用一个存储所有信息的字节来编写这段代码,但随着Enum在一段不相关的代码中增长,我可以达到我的位掩码代码中断的程度。我不想在已部署的应用程序中使用它,而是当枚举中的状态数超过存储变量中的位数时,我希望单元测试失败,因此当程序员添加第九个枚举时,他们可以调整变量的类型超过8位。
答案 0 :(得分:2)
我认为这个测试做你想要的。这可能是浪费你的时间来获得更多的通用。
public void testEnumSizeLessThanOneByte() throws Exception
{
assertTrue("MyEnum must have 8 or less values.",
MyEnum.values().length <= 8);
}
答案 1 :(得分:1)
如果这是一个真正的问题并且性能不是很重要,那么您可以始终使用bitset
答案 2 :(得分:0)
在Java字节中有固定大小(8位),因此不需要sizeof。
答案 3 :(得分:0)
首先,是的,Java中没有sizeof运算符。但是sizeof(byte)总是1。这真的是你的意思吗?
其次,您打算如何将9个布尔值放入一个字节?我希望不是用bitmasks。
如果您只是想找到设置的最高位,可以使用Integer.highestOneBit(m_myNum & 0xFF)
(请参阅文档here)。
编辑:当enum中的值太多时,您谈到将存储更改为更大的类型。根据{{3}},除非你有一个数组,否则没有记忆的理由不使用byte
而不是int
。所以我要说至少使用int
,如果大小超过32,请升级到long
。够简单吗?
答案 4 :(得分:0)
我发现this question可能会对您有所帮助: - )
不幸的是,Java中没有sizeof(),但请看一下这些问题的答案。我发现有趣的是来自JavaWorld的this article。
答案 5 :(得分:0)
我知道你正在努力想出一个通用的解决方案,但在这种情况下,我会采取懒惰的方式并硬编码大小并添加一些注释。
static final int MAX_BITS_IN_MY_NUM = 8; // Currently set to size of a byte. // Update if data type changes from byte to something larger than a byte. ... assertTrue(MAX_BITS_IN_MY_NUM >= MyEnum.values().length);