2013-03-29 47 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()方法或其他東西上。 –