Domanda

Sto scrivendo una unità di test per un metodo che racchiude i valori booleani in un byte.I vari bit posizioni sono determinate dal valore di un enum, che ha solo 5 valori, ma è immaginabile (anche se molto improbabile) che questo numero potrebbe passare al punto 9.

Mi piacerebbe un semplice test lungo le linee di:

byte privati m_myNum;enum MyEnum {...}

assert(sizeof(m_myNum) <= MyEnum.i valori di().lunghezza);

Ho l'impressione che non c'è una funzione sizeof in Java.Cosa c'è di più elegante soluzione?

---EDIT

Io non credo di essere stato chiaro.Io non sono preoccupato per la normale esecuzione.Il mio problema è che riesco a scrivere il codice ora con un byte che contiene tutte le informazioni, ma come Enum cresce in un altro parte di codice, ho potuto raggiungere un punto in cui il mio bitmasking codice rompe.Piuttosto che avere questo in un'applicazione distribuita, mi piacerebbe avere una unità di test ha esito negativo quando il numero di stati in enum supera il numero di bit nell'archiviazione variabile, in modo che quando un programmatore aggiunge che nono enum, si può regolare il tipo della variabile a qualcosa di più di otto bit.

È stato utile?

Soluzione

Penso che questo test non ciò che si desidera.È probabilmente uno spreco di il vostro tempo per ottenere più generico rispetto a questo.

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

Altri suggerimenti

se questa è una preoccupazione reale e le prestazioni non è importante, si può sempre utilizzare un bitset

In Java byte ha dimensione fissa (8 bit), quindi non è necessario per sizeof.

Ho trovato questa domanda che può aiutare a voi :-)

Purtroppo, non c'è sizeof() in Java, ma guardate le risposte a questa domande.Quello che ho trovato interessante è questo articolo da JavaWorld.

Prima, sì, non c'è nessun operatore sizeof in Java.Ma sizeof(byte) è sempre 1, comunque.È davvero questo quello che volevi dire?

Secondo, come hai intenzione di mettere 9 booleane in un byte?Non con maschere di bit, spero.

Se si desidera solo per trovare il massimo bit impostato, è possibile utilizzare Integer.highestOneBit(m_myNum & 0xFF) (vedere la documentazione qui).


EDIT:Si parla di modificare lo spazio di memoria a un tipo più grande quando ci sono troppi valori di enumerazione.Secondo questa domanda, non c'è memoria motivo per non usare un byte invece di un int a meno che non si dispone di una matrice.Quindi direi di utilizzare un int al minimo, e l'aggiornamento a una long se la dimensione è maggiore di 32.Abbastanza semplice?

So che stai cercando di trovare una soluzione generica, ma,in questo caso io prenderei il modo pigro e rigido codice dimensioni e aggiungere alcuni commenti.

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top