是的可以。下面是一个最终可以提高性能的实例:
条件编译是一种技术,在这种技术中,代码行不会根据特定条件编译到类文件中。这可用于删除生产生成中的大量调试代码。
考虑以下几点:public class ConditionalCompile {
private final static boolean doSomething= false;
if (doSomething) {
// do first part.
}
if (doSomething) {
// do second part.
}
if (doSomething) {
// do third part.
}
if (doSomething) {
// do finalization part.
}}
通过将DoSomething属性转换为最终属性,您已经告诉编译器,每当它看到DoSomething时,它应该按照编译时替换规则用false替换它。编译器的第一次传递将代码更改为某物就像这样:public class ConditionalCompile {
private final static boolean doSomething= false;
if (false){
// do first part.
}
if (false){
// do second part.
}
if (false){
// do third part.
}
if (false){
// do finalization part.
}}
一旦完成,编译器将再次查看它,并看到代码中有一些不可访问的语句。由于您使用的是高质量的编译器,所以它不喜欢所有那些无法访问的字节码。所以它移除了它们,你就得到了这样的结果:public class ConditionalCompile {
private final static boolean doSomething= false;
public static void someMethodBetter( ) {
// do first part.
// do second part.
// do third part.
// do finalization part.
}}
从而减少了任何过多的代码,或任何不必要的有条件检查。
编辑:作为一个示例,让我们使用以下代码:public class Test {
public static final void main(String[] args) {
boolean x = false;
if (x) {
System.out.println("x");
}
final boolean y = false;
if (y) {
System.out.println("y");
}
if (false) {
System.out.println("z");
}
}}
在用Java 8编译此代码和用javap -c Test.class我们得到:public class Test {
public Test();
Code:
0: aload_0 1: invokespecial #8 // Method java/lang/Object."":()V
4: return
public static final void main(java.lang.String[]);
Code:
0: iconst_0 1: istore_1 2: iload_1 3: ifeq 14
6: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
9: ldc #22 // String x
11: invokevirtual #24 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
14: iconst_0 15: istore_2 16: return}
我们可以注意到,编译后的代码只包含非最终变量。x..这表明最终变量对性能有影响,至少在这个简单的情况下是这样的。