switchステートメントはケースをチェックするたびにgetNum()を呼び出しますか?または、getNum()から返されるintに一時変数を割り当てて、各ケースをチェックしますか?
式は1getNum()
回だけ評価されます。セマンティクスの詳細については、JLSセクション14.11を参照してください。
(実際、switchステートメントは通常、各ケースに対して値をテストしないコードにコンパイルされます。ただし、ケースの数と広がり、およびJavaコンパイラーの詳細によって異なります。)
「すぐに事件に飛び込む」とはどういう意味ですか?
(ネイティブ)マシンコードレベルでの「トリック」は、さまざまなケースのブランチアドレスのテーブルを作成することです。次に、スイッチ式の値を使用してテーブルにインデックスを付けます。擬似コードでは、次のようになります。
value = evaluate(expression)
branchAddress = switchTable[value]
jump(branchAddress)
ご覧のとおり、これにより、で一連のテストを実行する必要がなくなりますvalue
。ただし、欠点は、スイッチケースの値の範囲が大きい場合、スイッチテーブルが大きくなる可能性があることです。したがって、上記の私の警告:JITコンパイラは、スイッチをこの方法でコンパイルするか、一連のテストとしてコンパイルするか、または2つのアプローチの組み合わせを使用するかを決定する必要があります。