【发布时间】:2013-01-08 02:37:36
【问题描述】:
假设我们有以下类:
public class Message extends Object {}
public class Logger implements ILogger {
public void log(Message m) {/*empty*/}
}
以及以下程序:
public static void main(String args[]) {
ILogger l = new Logger();
l.log((Message)null); // a)
l.log(new Message()); // b)
}
Java 编译器会去掉语句 a 和 b 吗?在这两种情况下(剥离或不剥离),Java 编译器做出决定的理由是什么?
【问题讨论】:
-
它可能会内联导致很少或没有代码的空方法。
-
如果你的
main方法不在Logger类编译器不应该优化它,因为Logger类可以稍后重新编译,这次使用log方法中的代码。 -
您对 log() 的第二次调用可能永远不会得到优化,因为 Message() 构造函数可能会产生副作用。