Программно рассчитать размер типа значения - PullRequest
2 голосов
/ 02 декабря 2008

Я пишу модульный тест для метода, который упаковывает логические значения в байт. Различные битовые местоположения определяются значением перечисления, которое в настоящее время имеет только 5 значений, но вполне возможно (хотя и крайне маловероятно), что это число может перейти к 9.

Я бы хотел провести простой тест в следующем виде:

закрытый байт m_myNum; enum MyEnum {...}

assert (sizeof (m_myNum) <= MyEnum.values ​​(). Length); </p>

У меня сложилось впечатление, что в Java нет функции sizeof. Какой самый элегантный обходной путь?

--- EDIT

Не думаю, что мне было ясно. Я не беспокоюсь о нормальном времени выполнения. Моя проблема в том, что теперь я могу написать этот код с байтом, в котором хранится вся информация, но, поскольку Enum растет в несвязанной части кода, я могу достигнуть точки, где мой код битовой маскировки нарушается. Вместо того, чтобы иметь это в развернутом приложении, я хотел бы провести модульный тест, который не проходит, когда число состояний в перечислении превышает число битов в переменной хранения, поэтому, когда программист добавляет это девятое перечисление, они могут настроить тип переменной для чего-то более восьми битов.

Ответы [ 6 ]

2 голосов
/ 02 декабря 2008

Я думаю, что этот тест делает то, что вы хотите. Вероятно, это пустая трата вашего времени, чтобы получить более общий характер, чем этот.

public void testEnumSizeLessThanOneByte() throws Exception 
{ 
    assertTrue("MyEnum must have 8 or less values.", 
                MyEnum.values().length <= 8);
}
1 голос
/ 03 декабря 2008

, если это реальная проблема, а производительность не так важна, вы всегда можете использовать bitset

0 голосов
/ 02 декабря 2008

Я знаю, что вы пытаетесь придумать общее решение, но в этом случае я бы взял ленивый выход, жестко закодировал размер и добавил несколько комментариев.

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);
0 голосов
/ 02 декабря 2008

Я нашел этот вопрос , который может вам помочь: -)

К сожалению, в Java нет функции sizeof (), но взгляните на ответы на эти вопросы. Мне показалось интересным эта статья из JavaWorld.

0 голосов
/ 02 декабря 2008

Во-первых, да, в Java нет оператора sizeof. Но sizeof (байт) всегда равен 1. Это действительно то, что ты хотел сказать?

Во-вторых, как вы намеревались поместить 9 булев в один байт? Надеюсь, не с битовыми масками.

Если вы просто хотите найти самый высокий установленный бит, вы можете использовать Integer.highestOneBit(m_myNum & 0xFF) (см. Документы здесь ).


РЕДАКТИРОВАТЬ: Вы говорите об изменении хранилища на больший тип, когда в перечислении слишком много значений. Согласно этому вопросу , нет никакой причины памяти не использовать byte вместо int, если у вас нет массива. Поэтому я бы сказал, что используйте int как минимум и обновите до long, если размер превышает 32. Достаточно просто?

0 голосов
/ 02 декабря 2008

В Java байт имеет фиксированный размер (8 бит), поэтому нет необходимости в sizeof.

...