2013-03-29 2 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

보이지만 그것은 초이다

now nested 
Innerclass initialized 

의미 날 (openjdk7)의 경우,이 결과

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"); 
     } 
    } 
} 

if (DEBUG) {...}이 제거되었지만 메서드 호출이 없으므로 메서드 매개 변수가 설정됩니다.

+0

그것은 안드로이드 OS에 관한 것이 었 습니다만,이 경우 결과가 같다고 생각합니다. –

+0

오, 나는 그것을 몰랐다. : O 하지만 테스트를 실행할 수도 있습니다. 그렇죠? – skirsch

+0

예, main 함수 대신 Activity의 onCreate() 메소드 또는 다른 함수에서 실행됩니다. –

관련 문제