4

これを使用することの長所と短所は次のとおりです。

String a = new String();
switch (i) {
case 1: a = "Cueck"; break;
case 2: a = "Blub"; break;
case 3: a = "Writing cases is BORING!"; break;
}
System.out.println(a);

対:

switch (i) {
case 1: System.out.println("Cueck"); break;
case 2: System.out.println("Blub"); break;
case 3: System.out.println("Writing cases is BORING!"); break;
}

より良いバイトコードを生成するのはどれですか? そして、どちらがより多くのバイトコードを生成しますか?

4

3 に答える 3

5

最初のオプションはよりすっきりとしており、冗長なコードが少なくなります。提案された変更の 1 つ:

String a;

switch (i) {
  case 1: a = "Cueck"; break;
  case 2: a = "Blub"; break;
  case 3: a = "Writing cases is BORING!"; break;
  default: throw new IllegalStateException("Unknown option!");
}

System.out.println(a);

不必要に文字列を作成しないでくださいa。必要な場合はインスタンス化する必要があります。デフォルトのケースでは、例外をスローするかa、デフォルト値に設定する必要があります。

より良いバイトコードを生成するのはどれですか? そして、どちらがより多くのバイトコードを生成しますか?

私はそれについて心配しません。これは、実際のアプリケーションでボトルネックになる可能性があるとは思いません。また、アプリケーションが実行されると、JVM がバイトコードを最適化するために何をするかを確認することもできません。

于 2013-03-08T09:55:46.113 に答える
4

バイトコードのサイズに大きな違いはないと思いますが、最初のアプローチをお勧めします。将来のコード変更でコールしないことにした場合でも、System.out.println(a)すべてのスイッチlogger.debug(a)ではなく 1 か所でのみ変更します。case

于 2013-03-08T09:53:22.147 に答える
4

を使用javap -c classnameすると、自分でバイトコードを確認できます。

オプション1は次のとおりです。

(注、初期化する必要がありました。a = nullそうしないとコンパイルされません)

   7:   aconst_null
   8:   astore_2
   9:   iload_1
   10:  tableswitch{ //1 to 3
                1: 36;
                2: 42;
                3: 48;
                default: 51 }
   36:  ldc     #3; //String Cueck
   38:  astore_2
   39:  goto    51
   42:  ldc     #4; //String Blub
   44:  astore_2
   45:  goto    51
   48:  ldc     #5; //String Writing cases is BORING!
   50:  astore_2
   51:  getstatic       #6; //Field java/lang/System.out:Ljava/io/PrintStream;
   54:  aload_2
   55:  invokevirtual   #7; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   58:  return

オプション 2 は次のとおりです。

   7:   iload_1
   8:   tableswitch{ //1 to 3
                1: 36;
                2: 47;
                3: 58;
                default: 66 }
   36:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;
   39:  ldc     #4; //String Cueck
   41:  invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   44:  goto    66
   47:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;
   50:  ldc     #6; //String Blub
   52:  invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   55:  goto    66
   58:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;
   61:  ldc     #7; //String Writing cases is BORING!
   63:  invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   66:  return

個人的には、この例でより良いバイトコードはないと思います。オプション 1 の方が読みやすいと思います。

于 2013-03-08T10:02:22.530 に答える