以编程方式计算值类型的大小

时间:2008-12-02 18:28:43

标签: java unit-testing sizeof bitmask memory-size

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

我想要一个简单的测试:

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

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

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

--- EDIT

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

6 个答案:

答案 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);