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

似乎第一个片段没有删除它,但它是第二个:

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 回答