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

您的第一个选项更简洁,冗余代码更少。一项建议更改:

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)您只会在一个地方而不是所有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 回答