考虑以下设置:
// debugger class
public class Debug
{
// setting
public final static boolean DEBUG = false;
void print_checked( String s )
{
if( DEBUG )
System.out.print( s );
}
void print_unchecked( String s )
{
System.out.print( s );
}
}
// worker class
public class Algorithm
{
Debug debugger;
public void heavyWeightAlgorithmImplementation()
{
// method 1
debugger.print_checked( "This method 1" );
// method 2
if( debugger.DEBUG )
debugger.print_unchecked( "Or this method 2" );
}
}
我已阅读here Java 中的final boolean
很可能会被优化掉。然而,正如我的设置一样,if 条件位于另一个类中,并且当前在 print_checked()
中实现。 Java 是否也优化了函数调用(方法 1),还是我必须像方法 2 那样重写所有内容?
编辑#1:再次添加静态
最佳答案
我用jdk1.7编译了上面的例子,并在jd-gui中打开了*.class文件。
示例:
class Debug
{
// setting
public static final boolean DEBUG = false;
void print_checked( String s )
{
if( DEBUG )
System.out.print( s );
}
void print_unchecked( String s )
{
System.out.print( s );
}
}
public class Main
{
public static void main(String[] argc)
{
Debug debugger = new Debug();
debugger.print_checked(" This method 1");
if (debugger.DEBUG)
debugger.print_unchecked( "Or this method 2");
}
}
jd-gui:
// Debug.class
import java.io.PrintStream;
class Debug
{
public static final boolean DEBUG = false;
void print_checked(String paramString) {
}
void print_unchecked(String paramString) {
System.out.print(paramString);
}
}
// Main.class
public class Main
{
public static void main(String[] paramArrayOfString)
{
Debug localDebug = new Debug();
localDebug.print_checked(" This method 1");
}
}
如您所见,方法“print_checked”保留在Main.class代码中,但“print_unchecked”被删除。我不确定,但我认为空方法“print_checked”也可能被 Oracle JVM 忽略。
关于Java 最终 boolean 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24527232/