我一直认为final关键字对局部方法变量或参数没有影响。因此,我尝试测试以下代码,但似乎我错了:
private static String doStuffFinal() {
final String a = "A";
final String b = "B";
final int n = 2;
return a + b + n;
}
private static String doStuffNotFinal() {
String a = "A";
String b = "B";
int n = 2;
return a + b + n;
}
我检查了字节码,这两种方法的字节码不一样。idea中的反编译代码如下所示:
private static String doStuffFinal() {
String a = "A";
String b = "B";
int n = 2;
return "AB2";
}
private static String doStuffNotFinal() {
String a = "A";
String b = "B";
int n = 2;
return a + b + n;
}
为什么这两种方法有区别?javac不能优化这样一个微不足道的例子吗?编译器可以看到a、b和n在doStuffNotFinal中没有变化,并以相同的方式优化代码。为什么没有呢?
更重要的是,这是否意味着我们最好将final关键字放在所有地方,以确保获得最佳优化?