Frage

Ich Schreibe einen unit-test für eine Methode, die packs boolean Werte in byte.Die verschiedenen bit-Orte sind bestimmt durch den Wert eines enum, die nur 5 Werte, gerade jetzt, aber es ist denkbar (wenn auch äußerst unwahrscheinlich), dass diese Zahl könnte in die 9.

Ich würde gerne einen einfachen test entlang der Linien von:

private byte m_myNum;enum MyEnum {...}

assert(sizeof(m_myNum) <= MyEnum.Werte().Länge);

Ich bin unter dem Eindruck, dass es nicht eine Funktion sizeof in Java.Was ist die eleganteste Lösung?

---BEARBEITEN

Ich glaube, ich war nicht klar.Ich bin nicht besorgt über die die normale Laufzeit.Mein Problem ist, dass ich schreiben kann diesen code nun mit einem byte speichert alle Informationen, die aber als Enum wächst in einem unabhängigen Teil des Codes, ich könnte einen Punkt erreichen, wo meine bitmasking code bricht.Anstatt dies in eine bereitgestellte Anwendung, ich möchte einen unit-test, der fehlschlägt, wenn die Zahl der Staaten in der enum übersteigt die Anzahl der bits im Speicher Variablen, so dass, wenn ein Programmierer fügt hinzu, dass neunten enum, Sie können stellen Sie die Art der Variablen, um etwas mit mehr als acht bits.

War es hilfreich?

Lösung

Ich denke, dieser test macht, was man will.Es ist wahrscheinlich eine Verschwendung von Ihrer Zeit, mehr allgemein als dieses.

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

Andere Tipps

wenn dies eine echte Sorge, und die Leistung ist nicht so wichtig, Sie könnte immer verwenden Sie ein bitset

In Java-byte hat Feste Größe (8 bit), so dass keine Notwendigkeit für sizeof.

Ich fand diese Frage das kann dir helfen :-)

Leider gibt es keine sizeof() in Java, aber werfen Sie einen Blick auf die Antworten auf diese Fragen.Eine, die ich interessant fand in diesem Artikel von JavaWorld.

Erstens, ja, es gibt keinen sizeof-operator in Java.Aber sizeof(byte) immer 1 ist, sowieso.Ist das wirklich das, was Sie sagen wollte?

Zweite, wie Sie waren beabsichtigt zu fit 9 Boolean in ein byte?Nicht mit Bitmasken, hoffe ich.

Wenn Sie wollen einfach nur, um die höchste bit, das gesetzt wird, die Sie nutzen könnten Integer.highestOneBit(m_myNum & 0xFF) (siehe der Dokumentation hier).


EDIT:Sie sprechen über die änderung der Lagerung, um eine größere Art, wenn es sind zu viele Werte in der enum.Nach diese Frage, es gibt keinen memory-Grund, nicht zu verwenden eine byte statt eines int es sei denn, Sie haben ein array.Also ich würde sagen, verwenden Sie einen int auf minimum, und ein upgrade auf eine long wenn die Größe übersteigt 32.Einfach genug?

Ich weiß, Sie versuchen zu kommen mit einer generische Lösung,aber in diesem Fall würde ich den faulen Weg aus und codieren Sie die Größe und fügen Sie einige Kommentare.

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top