0

Javaプログラムにいくつかのswitchステートメントがあります。私の質問は、次のようswitchなステートメントを作成する場合です。

switch (getNum()) {
    case 0: // do something
    case 1: // do something
    ...
}

切り替えられる変数がアクセサメソッド(別名「getter」メソッド)から返される場合、switchステートメントgetNum()はケースをチェックするたびに呼び出しますか?または、各ケースをチェックするために、int返される元に一時変数を割り当てますか?getNum()

4

2 に答える 2

3

switchステートメントはケースをチェックするたびにgetNum()を呼び出しますか?

'各ケースをチェックする'ことはまったくありません。式を1回評価し、実装に応じていくつかの手法の1つを介して、関連するケースにすぐにジャンプします。

または、getNum()から返されるintに一時変数を割り当てて、各ケースをチェックしますか?

それもそれをしません:上記を見てください。

于 2012-07-07T04:05:20.620 に答える
2

switchステートメントはケースをチェックするたびにgetNum()を呼び出しますか?または、getNum()から返されるintに一時変数を割り当てて、各ケースをチェックしますか?

式は1getNum()回だけ評価されます。セマンティクスの詳細については、JLSセクション14.11を参照してください。

(実際、switchステートメントは通常、各ケースに対して値をテストしないコードにコンパイルされます。ただし、ケースの数と広がり、およびJavaコンパイラーの詳細によって異なります。)


「すぐに事件に飛び込む」とはどういう意味ですか?

(ネイティブ)マシンコードレベルでの「トリック」は、さまざまなケースのブランチアドレスのテーブルを作成することです。次に、スイッチ式の値を使用してテーブルにインデックスを付けます。擬似コードでは、次のようになります。

  value = evaluate(expression)
  branchAddress = switchTable[value]
  jump(branchAddress)

ご覧のとおり、これにより、で一連のテストを実行する必要がなくなりますvalue。ただし、欠点は、スイッチケースの値の範囲が大きい場合、スイッチテーブルが大きくなる可能性があることです。したがって、上記の私の警告:JITコンパイラは、スイッチをこの方法でコンパイルするか、一連のテストとしてコンパイルするか、または2つのアプローチの組み合わせを使用するかを決定する必要があります。

于 2012-07-07T04:02:29.207 に答える