使用它的优点和缺点是什么:
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;
}
哪个生成更好的字节码?哪个生成更多字节码?
答案 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更具可读性。