Question

J'écris un test unitaire pour une méthode qui regroupe les valeurs booléennes dans un octet.Les différents emplacements de bits sont déterminés par la valeur d'une énumération, qui n'a actuellement que 5 valeurs, mais il est concevable (bien qu'extrêmement improbable) que ce nombre puisse atteindre 9.

J'aimerais un test simple du type :

octet privé m_myNum ;enum MonEnum {...}

assert(sizeof(m_myNum) <= MyEnum.values().length);

J'ai l'impression qu'il n'y a pas de fonction sizeof en Java.Quelle est la solution de contournement la plus élégante ?

---MODIFIER

Je ne pense pas avoir été clair.Je ne suis pas préoccupé par le temps d'exécution normal.Mon problème est que je peux écrire ce code maintenant avec un octet qui stocke toutes les informations, mais à mesure que l'Enum se développe dans une partie de code non liée, je pourrais atteindre un point où mon code de masquage de bits se brise.Plutôt que d'avoir cela dans une application déployée, j'aimerais avoir un test unitaire qui échoue lorsque le nombre d'états dans l'énumération dépasse le nombre de bits dans la variable de stockage, donc lorsqu'un programmeur ajoute cette neuvième énumération, il peut ajuster le type de la variable en quelque chose de plus de huit bits.

Était-ce utile?

La solution

Je pense que ce test fait ce que vous voulez.C'est probablement une perte de temps d'être plus générique que cela.

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

Autres conseils

s'il s'agit d'un réel problème et que les performances ne sont pas si importantes, vous pouvez toujours utiliser un jeu de bits

En Java, l'octet a une taille fixe (8 bits), donc pas besoin de sizeof.

j'ai trouvé cette question ça peut t'aider :-)

Malheureusement, il n'y a pas de sizeof() en Java, mais jetez un œil aux réponses à ces questions.Celui que j'ai trouvé intéressant est Cet article de JavaWorld.

Tout d’abord, oui, il n’y a pas d’opérateur sizeof en Java.Mais sizeof(byte) est toujours 1 de toute façon.Est-ce vraiment ce que tu voulais dire ?

Deuxièmement, comment comptiez-vous insérer 9 booléens dans un octet ?Pas avec des bitmasks, j'espère.

Si vous souhaitez simplement trouver le bit le plus élevé défini, vous pouvez utiliser Integer.highestOneBit(m_myNum & 0xFF) (voir la doc ici).


MODIFIER:Vous parlez de changer le stockage en un type plus grand lorsqu'il y a trop de valeurs dans l'énumération.Selon cette question, il n'y a aucune raison de mémoire de ne pas utiliser un byte au lieu d'un int sauf si vous avez un tableau.Donc je dirais d'utiliser un int au minimum, et passez à un long si la taille dépasse 32.Assez simple?

Je sais que vous essayez de trouver une solution générique, mais dans ce cas, je choisirais la solution paresseuse, coderais en dur la taille et ajouterais quelques commentaires.

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top