値型のサイズをプログラムで計算する
-
22-07-2019 - |
質問
ブール値をバイトにパックするメソッドの単体テストを書いています。さまざまなビット位置は列挙型の値によって決定され、現在は5つの値しかありませんが、この数値が9になる可能性は非常に低いですが、考えられます。
次の行に沿った簡単なテストが欲しい:
プライベートバイトm_myNum; 列挙型MyEnum {...}
assert(sizeof(m_myNum)<!> lt; = MyEnum.values()。length);
Javaにはsizeof関数がないという印象を受けています。最もエレガントな回避策は何ですか?
---編集
はっきりしていなかったと思う。通常のランタイムについては気にしません。私の問題は、すべての情報を格納するバイトを使用してこのコードを作成できることですが、Enumがコードの無関係な部分で大きくなると、ビットマスクコードが壊れるポイントに達する可能性があります。デプロイされたアプリケーションでこれを保持するのではなく、enumの状態の数がストレージ変数のビットの数を超えたときに失敗するユニットテストが必要です。変数の型から8ビットを超えるものへ。
解決
このテストはあなたが望むことをしていると思います。これよりも汎用性を高めるのはおそらく時間の無駄です。
public void testEnumSizeLessThanOneByte() throws Exception
{
assertTrue("MyEnum must have 8 or less values.",
MyEnum.values().length <= 8);
}
他のヒント
これが本当の懸念であり、パフォーマンスがそれほど重要でない場合は、常にビットセット
Javaバイトでは固定サイズ(8ビット)であるため、sizeofは不要です。
あなたに役立つこの質問:-)
残念ながら、Javaにはsizeof()はありませんが、この質問の答えを見てください。おもしろいと思うのは、この記事 JavaWorldから。
まず、はい、Javaにはsizeof演算子はありません。ただし、sizeof(byte)は常に1です。これは本当にあなたが言いたいことですか?
第二に、9つのブール値を1バイトに収めるつもりはどうでしたか?ビットマスクではなく、願っています。
設定されている最上位ビットのみを検索する場合は、Integer.highestOneBit(m_myNum & 0xFF)
を使用できます(ドキュメントこちら)。
編集:列挙型の値が多すぎる場合にストレージをより大きなタイプに変更することについて話します。 この質問によると、<を使用しないメモリ上の理由はありません=>配列がない限り、byte
の代わりに。したがって、少なくともint
を使用し、サイズが32を超える場合はlong
にアップグレードすると言います。十分に単純ですか?
一般的な解決策を考え出そうとしていることは知っていますが、この場合は怠wayな方法を取り、サイズをハードコーディングしてコメントを追加します。
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);