我的问题最好用一个例子。
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)
似乎没有删除第一个片段,但它是第二个:
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) {...}
,但方法调用未被删除,因此设置了方法参数。