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 
  }
4

1 に答える 1

1

最初のスニペットでは削除されていないようですが、2番目のスニペットでは削除されています:

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) {...}は削除されますが、メソッド呼び出しは削除されないため、メソッド パラメータが設定されます。

于 2013-03-29T21:16:21.787 に答える