Pergunta

Eu estou escrevendo um teste de unidade para um método que pacotes booleano valores em um byte. Os vários locais bit são determinados pelo valor de um enum, que só tem 5 valores agora, mas é concebível (embora extremamente improvável) que este número poderia ir a 9.

Eu gostaria de um simples teste ao longo das linhas de:

byte privada m_myNum; enum MyEnum {...}

Assert (sizeof (m_myNum) <= MyEnum.values ??() de comprimento.);

Estou com a impressão de que não há uma função sizeof em Java. Qual é a solução mais elegante?

--- EDIT

Eu não acho que eu estava claro. Eu não estou preocupado com a execução normal. Meu problema é que eu posso escrever este código agora com um byte que armazena todas as informações, mas como o Enum cresce em uma parte não relacionada de código, eu poderia chegar a um ponto em que minha bitmasking quebras de código. Ao invés de ter isto em uma aplicação implantada, gostaria de ter uma unidade de teste que falha quando o número de membros na enumeração excede o número de bits na variável de armazenamento, de modo que quando um programador que adiciona nona enum, eles podem ajustar o tipo da variável para algo com mais de oito bits.

Foi útil?

Solução

Eu acho que este teste faz o que quiser. É provavelmente um desperdício de seu tempo para obter mais genérico do que isso.

public void testEnumSizeLessThanOneByte() throws Exception 
{ 
    assertTrue("MyEnum must have 8 or less values.", 
                MyEnum.values().length <= 8);
}

Outras dicas

Se esta é uma preocupação real e desempenho não é tão importante você sempre pode usar um bitset

byte

Em Java tem tamanho (8 bits) fixa, por isso não há necessidade de sizeof.

Eu encontrei esta questão que podem ajudá-lo: -)

Infelizmente, não há sizeof () em Java, mas dê uma olhada nas respostas de estas questões. Uma que eu achei interessante é este artigo a partir JavaWorld.

Em primeiro lugar, sim, não há nenhum operador sizeof em Java. Mas sizeof (byte) é sempre 1 de qualquer maneira. É realmente o que você quis dizer?

Em segundo lugar, como você foi com a intenção de ajustar 9 booleans em um byte? Não com bitmasks, espero.

Se você quiser apenas para encontrar o bit mais alto que do conjunto, você poderia usar Integer.highestOneBit(m_myNum & 0xFF) (veja a documentação aqui ).


EDIT: Você fala sobre a mudança do armazenamento para um tipo maior quando há muitos valores na enumeração. De acordo com a esta questão , não há nenhuma razão de memória não usar um byte em vez de um int menos que você tenha um array. Então eu diria que usar um int no mínimo, e atualizar para uma long se o tamanho for superior a 32. bastante simples?

Eu sei que você está tentando chegar a uma solução genérica, mas, neste caso, eu levaria a maneira preguiçosa para fora e código rígido o tamanho e adicionar alguns comentários.

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top