Вопрос

Я пишу модульный тест для метода, который упаковывает логические значения в байт.Расположение различных битов определяется значением перечисления, которое на данный момент имеет только 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top