2

ブール値をバイトにパックするメソッドの単体テストを書いています。さまざまなビット位置は列挙型の値によって決定され、現在は 5 つの値しかありませんが、この数が 9 になる可能性は考えられます (非常にありそうもないことですが)。

次の行に沿った簡単なテストが必要です。

プライベート バイト m_myNum; enum MyEnum {...}

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

Java には sizeof 関数がないという印象を受けました。最もエレガントな回避策は何ですか?

- -編集

私ははっきりしていなかったと思います。通常の実行時間は気にしません。私の問題は、すべての情報を格納するバイトを使用してこのコードを記述できるようになったことですが、Enum がコードの無関係な部分で大きくなると、ビットマスキング コードが壊れるポイントに到達する可能性があります。展開されたアプリケーションでこれを行うのではなく、列挙型の状態の数がストレージ変数のビット数を超えたときに失敗する単体テストを作成したいので、プログラマーがその9番目の列挙型を追加すると、調整できます変数の型を 8 ビット以上のものに変更します。

4

6 に答える 6

2

このテストはあなたが望むものだと思います。これよりも一般的なものを取得するのは、おそらく時間の無駄です。

public void testEnumSizeLessThanOneByte() throws Exception 
{ 
    assertTrue("MyEnum must have 8 or less values.", 
                MyEnum.values().length <= 8);
}
于 2008-12-02T19:14:19.770 に答える
1

これが本当に問題であり、パフォーマンスがそれほど重要でない場合は、常にビットセットを使用できます

于 2008-12-02T21:37:25.723 に答える
0

Java では、バイトは固定サイズ (8 ビット) であるため、sizeof は必要ありません。

于 2008-12-02T18:42:46.650 に答える
0

まず、はい、Java には sizeof 演算子はありません。とにかく sizeof(byte) は常に 1 です。これは本当にあなたが言いたかったことですか?

第二に、どのようにして 9 個のブール値を 1 バイトに収めるつもりでしたか? ビットマスクではないことを願っています。

設定されている最上位ビットを見つけたいだけの場合は、使用できます(こちらInteger.highestOneBit(m_myNum & 0xFF)のドキュメントを参照してください)。


編集:列挙型に値が多すぎる場合、ストレージをより大きな型に変更することについて話します。this questionによると、配列がない限りbyte、 an の代わりにa を使用しないメモリ上の理由はありません。intしたがってint、少なくとも を使用しlong、サイズが 32 を超える場合は にアップグレードするといいでしょう。

于 2008-12-02T18:43:07.960 に答える
0

私はあなたを助けるかもしれないこの質問を見つけました:-)

残念ながら、Java には sizeof() はありませんが、この質問の回答を見てください。私が興味深いと思ったのは、JavaWorld のこの記事です。

于 2008-12-02T18:50:36.277 に答える
0

あなたが一般的な解決策を考え出そうとしていることは知っていますが、この場合、怠惰な方法でサイズをハードコーディングし、コメントを追加します。

static final int MAX_BITS_IN_MY_NUM = 8; // 現在、バイトのサイズに設定されています。  
                                         // データ型が byte から byte より大きい値に変更された場合は更新します。
...
assertTrue(MAX_BITS_IN_MY_NUM >= MyEnum.values().length);
于 2008-12-02T19:19:30.837 に答える