存储在变量与多种不同方法中

时间:2013-03-08 09:49:21

标签: java variables switch-statement bytecode

使用它的优点和缺点是什么:

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;
}

哪个生成更好的字节码?哪个生成更多字节码?

3 个答案:

答案 0 :(得分: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将如何优化字节代码。

答案 1 :(得分:4)

我不认为字节码大小会有太大差异,但我建议采用第一种方法。如果您将来某些代码更改决定不再拨打System.out.println(a)logger.debug(a),则只会在一个地方更改,而不是在所有case次切换上。

答案 2 :(得分: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更具可读性。