Программный расчет размера типа значения
-
22-07-2019 - |
Вопрос
Я пишу модульный тест для метода, который упаковывает логические значения в байт.Расположение различных битов определяется значением перечисления, которое на данный момент имеет только 5 значений, но вполне возможно (хотя и крайне маловероятно), что это число может дойти до 9.
Мне нужен простой тест вроде:
личный байт m_myNum;перечислить MyEnum {...}
Assert(sizeof(m_myNum) <= MyEnum.values().length);
У меня сложилось впечатление, что в Java нет функции sizeof.Какой самый элегантный обходной путь?
---РЕДАКТИРОВАТЬ
Я не думаю, что я выразился ясно.Меня не беспокоит нормальное время выполнения.Моя проблема в том, что сейчас я могу написать этот код с байтом, в котором хранится вся информация, но по мере того, как Enum растет в несвязанной части кода, я могу достичь точки, когда мой код битовой маскировки сломается.Вместо того, чтобы использовать это в развернутом приложении, я хотел бы иметь модульный тест, который терпит неудачу, когда количество состояний в перечислении превышает количество битов в переменной хранения, поэтому, когда программист добавляет это девятое перечисление, он может настроить тип переменной имеет значение более восьми бит.
Решение
Я думаю, этот тест делает то, что вы хотите.Вероятно, это пустая трата вашего времени, чтобы получить более общий подход, чем этот.
public void testEnumSizeLessThanOneByte() throws Exception
{
assertTrue("MyEnum must have 8 or less values.",
MyEnum.values().length <= 8);
}
Другие советы
если это реальная проблема и производительность не так уж важна, вы всегда можете использовать набор битов
В Java байт имеет фиксированный размер (8 бит), поэтому sizeof не требуется.
я нашел этот вопрос это может вам помочь :-)
К сожалению, в Java нет метода sizeof(), но взгляните на ответы на эти вопросы.Один мне показался интересным Эта статья из JavaWorld.
Во-первых, да, в Java нет оператора sizeof.Но sizeof(byte) в любом случае всегда равен 1.Вы действительно это хотели сказать?
Во-вторых, как вы собирались уместить 9 логических значений в один байт?Надеюсь, не с битмасками.
Если вы просто хотите найти самый высокий установленный бит, вы можете использовать Integer.highestOneBit(m_myNum & 0xFF)
(см. документы здесь).
РЕДАКТИРОВАТЬ:Вы говорите об изменении хранилища на более крупный тип, когда в перечислении слишком много значений.В соответствии с этот вопрос, нет никаких оснований не использовать память byte
вместо int
если у вас нет массива.Поэтому я бы сказал, используйте int
как минимум, и обновить до long
если размер превышает 32.Достаточно просто?
Я знаю, что вы пытаетесь найти общее решение, но в этом случае я бы выбрал ленивый путь, жестко запрограммировал размер и добавил несколько комментариев.
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);