Pregunta

Estoy escribiendo una prueba unitaria para un método que empaqueta valores booleanos en un byte.Las distintas ubicaciones de bits están determinadas por el valor de una enumeración, que ahora solo tiene 5 valores, pero es concebible (aunque extremadamente improbable) que este número pueda llegar a 9.

Me gustaría una prueba simple como esta:

byte privado m_myNum;enumeración MiEnum {...}

afirmar (tamaño de (m_myNum) <= MyEnum.values().length);

Tengo la impresión de que no existe una función sizeof en Java.¿Cuál es la solución más elegante?

---EDITAR

No creo haber sido claro.No me preocupa el tiempo de ejecución normal.Mi problema es que ahora puedo escribir este código con un byte que almacena toda la información, pero a medida que Enum crece en una parte no relacionada del código, podría llegar a un punto en el que mi código de máscara de bits se rompa.En lugar de tener esto en una aplicación implementada, me gustaría tener una prueba unitaria que falle cuando el número de estados en la enumeración exceda el número de bits en la variable de almacenamiento, de modo que cuando un programador agregue esa novena enumeración, pueda ajustar el tipo de variable a algo con más de ocho bits.

¿Fue útil?

Solución

Creo que esta prueba hace lo que quieres. Probablemente sea una pérdida de tiempo ser más genérico que esto.

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

Otros consejos

si esto es una preocupación real y el rendimiento no es tan importante, siempre puede usar un bitset

En Java, el byte tiene un tamaño fijo (8 bits), por lo que no se necesita sizeof.

Encontré esta pregunta que puede ayudarte :-)

Desafortunadamente, no hay sizeof () en Java, pero eche un vistazo a las respuestas de estas preguntas. Una que encontré interesante es este artículo de JavaWorld.

Primero, sí, no hay un operador sizeof en Java. Pero sizeof (byte) siempre es 1 de todos modos. ¿Es esto realmente lo que querías decir?

Segundo, ¿cómo pretendía colocar 9 booleanos en un byte? No con máscaras de bits, espero.

Si solo desea encontrar el bit más alto establecido, puede usar Integer.highestOneBit(m_myNum & 0xFF) (vea los documentos aquí ).


EDITAR: habla de cambiar el almacenamiento a un tipo más grande cuando hay demasiados valores en la enumeración. De acuerdo con esta pregunta , no hay ninguna razón de memoria para no usar un < => en lugar de un byte a menos que tenga una matriz. Entonces, diría que use un int como mínimo y actualice a un long si el tamaño excede 32. ¿Suficientemente simple?

Sé que estás tratando de encontrar una solución genérica, pero, en este caso, tomaría la salida perezosa y codificaría el tamaño y agregaría algunos comentarios.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top