2013-03-29 24 views
1

我的问题是最好的例子。如果常量会阻止它被使用,优化器是否会阻止创建字符串参数?

public static boolean DEBUG = false; 

    public void debugLog(String tag, String message) { 
    if (DEBUG) 
     Log.d(tag, message); 
    } 

    public void randomMethod() { 
    debugLog("tag string", "message string"); //Example A 

    debugLog("tag string", Integer.toString(1));//Example B 

    debugLog("tag string", generateString());//Example C 
    } 


    public String generateString() { 
    return "this string"; 
    } 

我的问题是,在任何的实施例中,A,B或C - 由于串将不被最终用于将优化删除它?

或者问另一种方式,是否会更好地执行以下操作,从而确保不会创建字符串对象?

public void randomMethod() { 
    if (DEBUG) debugLog("tag string", "message string"); //Example A 

    if (DEBUG) debugLog("tag string", Integer.toString(1));//Example B 

    if (DEBUG) debugLog("tag string", generateString());//Example C 
    } 
+0

优化程序(如果写入权限)应该删除它们。 –

+1

实际上,A和C中的字符串都是文字,因此被实施,因此不会以任何方式创建字符串。但是这个问题并不重要,我明白你的意思。 – delnan

+0

@JesusRamos编译器作者想与你合作,关于正确性和实用性 – delnan

回答

1

好像它不是第一个片段中删除,但它是第二:

public class TestCompiler { 
    public static boolean DEBUG = false; 
    private static void debug(Object o) { 
     if (DEBUG) { 
      System.out.println(o); 
     } 
    } 
    public static void main(String[] args) { 
     if (DEBUG) { 
      System.out.println(new InnerClass()); 
     } 
     System.out.println("now nested"); 
     debug(new InnerClass()); 
    } 
    private static final class InnerClass { 
     static { 
      System.out.println("Innerclass initialized"); 
     } 
    } 
} 

对我来说(openjdk7),这导致:

now nested 
Innerclass initialized 

意义if (DEBUG) {...}被删除,但方法调用不是,因此方法参数被设置。

+0

这是关于Android OS的意思,但我认为在这种情况下结果是一样的。 –

+0

哦,我没有意识到这一点。 :O 但是,您也可以运行该测试,不是吗? – skirsch

+0

是的,只是代替主函数,它会运行在Activity的onCreate()方法或其他东西上。 –